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 数组进行算术比较?

4

2 回答 2

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

x.any()实际作用:它与 相同,这意味着如果其中的任何元素非零np.any(x),它就会返回。因此,您的比较是,这是错误的,因为在 python 2中是正确的,但不是,因为.Truex0 < True < 10 < TrueTrue < 1True == 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 的内置比较运算符链接一起使用。

于 2013-03-13T19:53:37.940 回答
1

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

((0 < x) & (x < 1)).any()
于 2013-03-13T19:55:48.830 回答