如何在python中检查列表是否在我的数组中

Mag*_*cke 5 python python-3.x

例如,如果我有:

import numpy as np
A = np.array([[2,3,4],[5,6,7]])
Run Code Online (Sandbox Code Playgroud)

我想检查以下列表是否与数组包含的列表之一相同:

B = [2,3,4]
Run Code Online (Sandbox Code Playgroud)

我试过了

B in A #which returns True
Run Code Online (Sandbox Code Playgroud)

但是以下也返回True,这应该是假的:

B = [2,2,2]
B in A
Run Code Online (Sandbox Code Playgroud)

Han*_*ave 6

尝试这种生成器理解.内置any()短路,因此您不需要额外的评估.

any(np.array_equal(row, B) for row in A)
Run Code Online (Sandbox Code Playgroud)

目前,np.array_equal还没有实现内部短路.在另一个问题中,讨论了实现这一目标的不同方式对性能的影响.

正如@Dan在下面提到的那样,广播是解决这个问题的另一种有效方式,而且通常(尽管不总是)更好的方式.对于一些粗略的启发式方法,以下是您可能希望在两种方法之间进行选择的方法.与任何其他微优化一样,对结果进行基准测试.

发电机理解

  • 减少内存占用(不创建阵列B==A)
  • 短路(如果第一行AB,我们没有看的其余部分)
  • 当行很大(定义取决于你的系统,但可能是~100 - 100,000)时,广播速度并不明显.
  • 使用内置语言功能.无论如何你已经安装了numpy,但是当我没有理由不这样做时,我会偏爱使用核心语言.

广播

  • 使用numpy解决极其广泛问题的最快方法.在这里使用它是很好的做法.
  • 如果我们必须搜索每一行A(例如,如果我们不希望B不在其中A),广播几乎总是更快(不一定总是快得多,见下一点)
  • 当行是短小的,发电机表达将无法有效地矢量化的计算,所以广播将大幅更快(当然,除非你有足够的行即短路人数大大超过了关注).
  • 在更广泛的环境中,你有更多的numpy代码,在这里使用广播可以帮助你的代码库中有更一致的模式.同事和未来你会欣赏没有编码风格和模式的混合.