[英]Find unique pairs of array with Python
我正在寻找一种pythonic方法来更快地完成这项操作
import numpy as np
von_knoten = np.array([0, 0, 1, 1, 1, 2, 2, 2, 3, 4])
zu_knoten = np.array([1, 2, 0, 2, 3, 0, 1, 4, 1, 2])
try:
for i in range(0,len(von_knoten)-1):
for j in range(0,len(von_knoten)-1):
if (i != j) & ([von_knoten[i],zu_knoten[i]] == [zu_knoten[j],von_knoten[j]]):
print(str(i)+".column equal " +str(j)+".column")
von_knoten = sp.delete(von_knoten , j)
zu_knoten = sp.delete(zu_knoten , j)
print(von_knoten)
print(zu_knoten)
except:
print('end')
所以我需要最快的方式
[0 0 1 1 4]
[1 2 2 3 2]
从
[0 0 1 1 1 2 2 2 3 4]
[1 2 0 2 3 0 1 4 1 2]
谢谢 ;)
关于你的代码的一些评论; 按原样,它不会做你想要的,它会打印一些东西,你甚至尝试运行它吗? 你能告诉我们你得到了什么吗?
首先,只需做一个range(len(von_knoten))
; 这将做你想要的,因为range
默认从0
开始,并在结束前结束一步。
如果从输入列表中delete
某些项目,并尝试访问它们末尾的项目,则可能会在耗尽输入列表分析之前获得IndexError
。
你做了一些sp.delete
但是我们不知道那是什么(代码也没有),这会引发一些AttributeError
。
唉,请不要使用except:
。 这将捕获您从未梦想过的异常,并可能解释为什么您不明白什么是错的。
然后,使用zip
内置函数获取已排序的二维元组,并删除重复项? 就像是:
>>> von_knoten = [0, 0, 1, 1, 1, 2, 2, 2, 3, 4]
>>> zu_knoten = [1, 2, 0, 2, 3, 0, 1, 4, 1, 2]
>>> set(tuple(sorted([m, n])) for m, n in zip(von_knoten, zu_knoten))
{(0, 1), (0, 2), (1, 2), (1, 3), (2, 4)}
我让你解决这个问题,以获得你想要的东西。
您正在尝试建立一组您以前从未见过的对。 您可以使用not in
但需要以任何方式检查:
L = []
for x,y in zip(von_knoten, zu_knoten):
if (x, y) not in L and (y, x ) not in L:
L.append((x, y))
这给出了一个元组列表
[(0, 1), (0, 2), (1, 2), (1, 3), (2, 4)]
你可以重塑一下。
这是一个矢量化输出 -
def unique_pairs(von_knoten, zu_knoten):
s = np.max([von_knoten, zu_knoten])+1
p1 = zu_knoten*s + von_knoten
p2 = von_knoten*s + zu_knoten
p = np.maximum(p1,p2)
sidx = p.argsort(kind='mergesort')
ps = p[sidx]
m = np.concatenate(([True],ps[1:] != ps[:-1]))
sm = sidx[m]
return von_knoten[sm],zu_knoten[sm]
样品运行 -
In [417]: von_knoten = np.array([0, 0, 1, 1, 1, 2, 2, 2, 3, 4])
...: zu_knoten = np.array([1, 2, 0, 2, 3, 0, 1, 4, 1, 2])
In [418]: unique_pairs(von_knoten, zu_knoten)
Out[418]: (array([0, 0, 1, 1, 2]), array([1, 2, 2, 3, 4]))
从这里使用np.unique
和void
视图方法
def unique_pairs(a, b):
c = np.sort(np.stack([a, b], axis = 1), axis = 1)
c_view = np.ascontiguousarray(c).view(np.dtype((np.void,
c.dtype.itemsize * c.shape[1])))
_, i = np.unique(c_view, return_index = True)
return a[i], b[i]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.