NumPy数组的算术比较

4
>>> import numpy as np
>>> x = np.eye(3)
>>> x[1, 2] = .5
>>> x
array([[ 1. ,  0. ,  0. ],
       [ 0. ,  1. ,  0.5],
       [ 0. ,  0. ,  1. ]])
>>> 0 < x.any() < 1
False
>>> 

我想检查numpy数组是否包含介于0和1之间的任何值。
我将0 < x.any() < 1解读为“如果存在大小大于0且小于1的任何元素,则返回true”,但显然不是这种情况。
我该如何在numpy数组上进行算术比较?
2个回答

2
>>> np.any((0 < x) & (x < 1))
True
x.any()的实际作用:与np.any(x)相同,如果x中的任何元素非零,则返回True。所以你的比较是0 < True < 1,这是错误的,因为在Python 2中,0 < True为true,但True < 1不是,因为True == 1

相比之下,在这种方法中,我们制作布尔数组,判断每个元素是否符合比较条件,然后检查该数组中是否有任何一个元素为true:

>>> 0 < x
array([[ True, False, False],
       [False,  True,  True],
       [False, False,  True]], dtype=bool)
>>> x < 1
array([[False,  True,  True],
       [ True, False,  True],
       [ True,  True, False]], dtype=bool)
>>> (0 < x) & (x < 1)
array([[False, False, False],
       [False, False,  True],
       [False, False, False]], dtype=bool)

由于不幸的是,numpy不能(我认为也无法)使用Python内置的比较运算符链,因此您必须进行显式的&操作。


使用您的代码,我得到了ValueError:具有多个元素的数组的真值是模糊的。请使用a.any()或a.all() - user2136786
是的,抱歉,一开始我在假装(总是忘记在numpy中操作符链接不起作用)。现在已经更新了,并有解释。 - Danica
1
比较链在numpy数组中无法使用的原因是,Python将a<b<c解释为a<b and b<c,而对于numpy数组,我们需要将其解释为a<b & b<c - shx2
@shx2 如果numpy选择像a&b一样解释a and b,从技术上讲可能是可行的(我想)。不过它没有这样做,这可能是一个总体上不错的选择 - 只是我经常会忘记这一点。 :) - Danica
在Python中,您无法重载布尔andor运算符。这不是NumPy的选择。 - shx2
当然,你是对的。我曾以为可以通过一些技巧涉及__bool__/__nonzero__来绕过它,但似乎不行。 - Danica

1

你的代码首先测试 x.any(),这会得出 True 的结果,因为 x 包含非零值。然后它测试 0 < True (=1) < 1,结果是 False。请执行以下操作:

((0 < x) & (x < 1)).any()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接