2015-12-15 161 views
1

在我的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

什么是_“非常接近”_? – Bart

+0

我认为你正在寻找像numpy的'assert_almost_equal'这样的东西。有关示例,请参见[docs](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.testing.assert_almost_equal.html)。 – jorgeh

+0

为什么'allclose'没有意义? (它广播!) – user2357112

回答

3

您可以获取0个元素并使用布尔索引将它们屏蔽掉。一旦完成,np.allclose正是你想要的:

zeros = arr == 0.0 
without_zeros = arr[~zeros] 
np.allclose(without_zeros, 1, ...) 
0

我能想到的最简单的事情就是遍历数组中的每个元素并测试它是接近于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 
+0

我会遍历'arr.flat'而不是假设它是一个2D数组。 – mgilson

+0

@mgilson我将它改为使用'np.nditer'。 “arr.flat”与“np.nditer”有什么优势? – forkrul

+0

我不知道:-)。可能两者之间没有太大的区别 - 尽管我已经有一段时间了,因为我已经大量使用numpy了,所以我可能在这里错了...... – mgilson

相关问题