检查numpy数组中的所有元素是否匹配
问题描述:
在我的python测试脚本中,我想断言numpy数组的所有元素是非常接近于1.0还是等于0.0。该阵列是这样的:检查numpy数组中的所有元素是否匹配
[[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的,但也使得这里的感觉。理想情况下,函数应该能够在测试场景中使用
答
您可以获取0个元素并使用布尔索引将它们屏蔽掉。一旦完成,np.allclose
正是你想要的:
zeros = arr == 0.0
without_zeros = arr[~zeros]
np.allclose(without_zeros, 1, ...)
答
我能想到的最简单的事情就是遍历数组中的每个元素并测试它是接近于1还是等于零:
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
什么是_“非常接近”_? – Bart
我认为你正在寻找像numpy的'assert_almost_equal'这样的东西。有关示例,请参见[docs](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.testing.assert_almost_equal.html)。 – jorgeh
为什么'allclose'没有意义? (它广播!) – user2357112