Pythonic测试行是否在数组中的方法

Emm*_*mma 12 python arrays testing numpy

这似乎是一个简单的问题,但我找不到一个好的答案.

我正在寻找一种pythonic方法来测试2d numpy数组是否包含给定行.例如:

myarray = numpy.array([[0,1],
                       [2,3],
                       [4,5]])

myrow1 = numpy.array([2,3])
myrow2 = numpy.array([2,5])
myrow3 = numpy.array([0,3])
myrow4 = numpy.array([6,7])
Run Code Online (Sandbox Code Playgroud)

给定myarray,我想编写一个函数,如果我测试myrow1则返回True,如果我测试myrow2,myrow3和myrow4则返回False.

我尝试了"in"关键字,它没有给我我预期的结果:

>>> myrow1 in myarray
True
>>> myrow2 in myarray
True
>>> myrow3 in myarray
True
>>> myrow4 in myarray
False
Run Code Online (Sandbox Code Playgroud)

它似乎只检查一个或多个元素是否相同,而不是所有元素都相同.有人可以解释为什么会这样吗?

我可以逐个元素执行此测试,如下所示:

def test_for_row(array,row):
    numpy.any(numpy.logical_and(array[:,0]==row[0],array[:,1]==row[1]))
Run Code Online (Sandbox Code Playgroud)

但这并不是非常pythonic,如果行有很多元素会变得有问题.必须有一个更优雅的解决方案.任何帮助表示赞赏!

rol*_*one 5

下面的SO问题可以帮助你,但基本上你可以使用:

any((myrow1 == x).all() for x in myarray)
Run Code Online (Sandbox Code Playgroud)

Numpy.Array在Python列表中?


eat*_*eat 3

您只需从数组中减去测试行即可。然后找出零个元素,并按列求和。那么这些就是总和等于列数的匹配。

例如:

In []: A= arange(12).reshape(4, 3)
In []: A
Out[]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
In []: 3== (0== (A- [3, 4, 5])).sum(1)
Out[]: array([False,  True, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

更新:基于评论和其他答案:
Paul的建议似乎确实能够简化代码:

In []: ~np.all(A- [3, 4, 5], 1)
Out[]: array([False,  True, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

JoshAdel的答案更普遍地强调与确定100%可靠方式平等相关的问题。因此,显然我的答案仅在可以明确确定平等的情况下才有效。

更新 2:但正如Emma我们所发现的,存在一些极端情况,其中 的Paul解决方案不会产生正确的结果。

  • 更具可读性的替代方案:“~np.all(AB, axis=1)”(其中 B 是“[3,4,5]”) (3认同)
  • 然后你可以将 @Paul 的代码包装在 `np.any` 中来测试是否有匹配的行。正如我在回答中提到的,如果您处理的是浮点数而不是整数,请小心,因为根据您分配“myrow”变量的方式,您可能会遇到有限精度的问题,并且需要另一种策略。 (3认同)