我有一个二维数组。每行有3个值(不一定是唯一的),例如:
[ [3, 4, 1],
[8, 1, 3],
[5, 6, 5] ]
有一个过程可生成3个数字的列表。我检查这个列表是否已经存在于我的数组中(相同的数字和相同的序列),如果是,忽略它,如果没有将它添加到数组中。此过程多次运行。
我检查存在的方式是通过循环:
c = 0
for s in range(len(l)):
if np.array_equal(l[s], new):
c = 1
break
if c == 0:
l = np.append(l, new).reshape(-1, 3)
其中l是我的列表,new是该过程生成的列表。
我的问题是,有没有办法在不使用循环的情况下进行检查。如果列表变得太大,例如100k +行,则检查过程会花费太多时间。请指导。
答案 0 :(得分:0)
您可以使用broadcasting
对所有行进行矢量化检查,如下所示 -
if ~(np.all(l == new,1)).any():
l = np.append(l, new).reshape(-1, 3)
示例运行 -
In [288]: l
Out[288]:
array([[4, 4, 0],
[1, 4, 1],
[0, 4, 4],
[4, 0, 4],
[2, 4, 2]])
In [289]: new
Out[289]: [7, 0, 4]
In [290]: if ~(np.all(l == new,1)).any():
...: l = np.append(l, new).reshape(-1, 3)
...:
In [291]: l
Out[291]:
array([[4, 4, 0],
[1, 4, 1],
[0, 4, 4],
[4, 0, 4],
[2, 4, 2],
[7, 0, 4]])