检查二维数组

时间:2015-10-09 13:01:19

标签: arrays python-3.x numpy vectorization

我有一个二维数组。每行有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 +行,则检查过程会花费太多时间。请指导。

1 个答案:

答案 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]])