numpy数组的算术比较

时间:2013-03-13 19:52:17

标签: python numpy

>>> 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 个答案:

答案 0 :(得分:2)

>>> np.any((0 < x) & (x < 1))
True

x.any()实际上做了什么:它与np.any(x)相同,这意味着如果True中的任何元素都非零,则返回x。所以你的比较是0 < True < 1,这是假的,因为在python 2中0 < True是真的,但是True < 1不是,因为True == 1

相比之下,在这种方法中,我们为每个元素建立比较是否为真的布尔数组,然后检查该数组中的任何元素是否为真:

>>> 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的内置的比较运算符链。

答案 1 :(得分:1)

您的代码首先测试x.any(),其评估结果为True,因为x包含非零值。然后它会测试0 < True (=1) < 1,即False。做:

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