【问题标题】:Check existence of a list in a 2d array检查二维数组中是否存在列表
【发布时间】:2015-10-09 13:01:19
【问题描述】:

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

【问题讨论】:

    标签: arrays python-3.x numpy vectorization


    【解决方案1】:

    您可以使用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]])
    

    【讨论】:

    • 谢谢。似乎正是我正在寻找的。让我阅读广播的概念以及您的条件的语法(对我来说非常陌生)。与我使用的传统循环相比,评估性能会很有趣。
    • @AbdulQadir 这在很大程度上取决于匹配的行到底有多远。
    • 它运行良好,性能也有显着提升。谢谢。
    【解决方案2】:

    您可以通过这种方式简单地检查 numpy 数组中的列表:

    In [1]: import numpy as np
    
    In [2]: a = np.array([ [3, 4, 1],
      [8, 1, 3],
      [5, 6, 5] ] )
    
    In [3]: [3,4,1] in a
    Out[3]: True
    

    【讨论】:

    • 我认为B 中的A 会根据问题的要求查找任何匹配项,而不是所有匹配项。所以[0,100,100] in np.arange(12).reshape(-1,3) 也给出了True
    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多