3

我需要查找一个 numpy 数组是否在其他 numpy 数组中,但它似乎与 python 列表不同。我试图在 numpy 文档和互联网中搜索这个问题,但没有回答。这是一个例子:

import numpy as np

m1=np.array([[1,2,3],[5,3,4]])
m2=np.array([5,4,3])
m2 in m1
True
m3=[[1,2,3],[5,3,4]]
m4=[5,4,3]
m4 in m3
False

在 numpy 中,我得到 True,但在 Python 列表中,我得到 False。是否有任何 numpy 函数可以完成这项工作?

谢谢。

4

1 回答 1

3

要获得与列表相同的行为in,您可以执行以下操作:

any(np.all(row == m2) for row in m1)

这会在 python 中的行上循环,这并不理想,但它应该可以工作。

要了解 numpy 发生了什么,以下是 numpy 邮件列表中 Robert Kernin的语义描述:in

它可以追溯到 bool(some_array) 的 Numeric 语义,如果任何元素不为零,则该语义为 True。就像 Python 中的任何其他可迭代容器一样,x in y基本上可以

for row in y:
   if x == row:
       return True
return False

沿 y 的第一个轴迭代并通过布尔相等进行比较。在 Numeric/numpy 的情况下,这种比较被广播。这就是 [3,6,4] 起作用的原因,因为有一行 3 在第一列。[4,2,345] 不起作用,因为 4 和 2 不在这些列中。

可能,在转换到 numpy 的 bool(some_array) 引发异常的语义期间,这应该被认为是一个错误。 scalar in array对于 ND 数组,可能应该按原样工作,但是应该明确说明几种不同的可能语义array in array ,就像 bool(some_array)。

于 2012-11-03T02:31:02.337 回答