Python 检查numpy数组中的所有元素是否匹配一个数字
在我的python测试脚本中,我想断言numpy数组的所有元素是否非常接近1.0或等于0.0。该数组如下所示:Python 检查numpy数组中的所有元素是否匹配一个数字,python,numpy,Python,Numpy,在我的python测试脚本中,我想断言numpy数组的所有元素是否非常接近1.0或等于0.0。该数组如下所示: [[0.9999999991268851 1.0000000223517418 0.999999986961484 ..., 0.9999999841675162 1.0000000074505806 0.9999999841675162] [0.9999999991268851 1.0000000223517418 0.999999986961484 ..., 0.9999
[[0.9999999991268851 1.0000000223517418 0.999999986961484 ...,
0.9999999841675162 1.0000000074505806 0.9999999841675162]
[0.9999999991268851 1.0000000223517418 0.999999986961484 ...,
0.9999999841675162 1.0000000074505806 0.9999999841675162]
[0.9999999991268851 1.0000000223517418 0.999999986961484 ...,
0.9999999841675162 1.0000000074505806 0.9999999841675162]
...,
[1.0000000198488124 1.0000000074505806 1.000000002568413 ...,
0.9999999888241291 0.9999999925494194 0.0]
[1.000000011001248 0.9999999850988388 0.9999999869323801 ...,
1.0000000186264515 0.9999999925494194 0.0]
[1.000000011001248 0.9999999850988388 0.9999999869323801 ...,
1.0000000186264515 0.9999999925494194 0.0]]
我曾想过使用numpy.allclose或numpy.array_equal,但在这里两者都没有意义。理想情况下,函数应该能够在测试场景中使用我能想到的最简单的事情就是迭代数组的每个元素,并测试它是否接近1或等于0:
import numpy as np
arr = np.array([[0.9999999991268851, 1.0000000223517418, 0.999999986961484],
[1.0000000186264515, 0.9999999925494194, 0.0]])
def is_one_or_zero(arr):
for elem in np.nditer(arr):
if not (elem == 0 or np.isclose(1.0, elem)):
return False
return True
print is_one_or_zero(arr) # Should be True
arr[0, 0] = 1.01
print is_one_or_zero(arr) # Should be False
您可以获取0元素并使用布尔索引将其屏蔽。完成后,
np.allclose
正是您想要的:
zeros = arr == 0.0
without_zeros = arr[~zeros]
np.allclose(without_zeros, 1, ...)
什么是“非常接近”?我想你看到的是numpy的
assert\u几乎等于。参见示例。为什么allclose
没有意义?(它可以广播!)我会迭代arr.flat
,而不是假设它是一个2D数组。@mgilson我将它改为使用np.nditer
。arr.flat
与np.nditer
相比有什么优势吗?我不知道:-)。这两者之间可能没有太大区别——虽然我已经有一段时间没有大量使用numpy了,所以我可能在这里错了…arr.flat
是一个非常简单的迭代器,总是以c-连续顺序进行迭代nditer
能够执行更复杂的操作,请参阅。另一方面,由于严重的python性能损失,numpy数组的python循环通常不是一个好主意。