2015-12-15 157 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

相關問題