2014-10-17 70 views
5

我想要斷定兩個Python字典是相等的(這意味着:等量密鑰,和從關鍵值每個映射是相等;順序並不重要)。一個簡單的辦法是assert A==B,但是,如果字典的值是numpy arrays這不起作用。如何編寫一個函數來檢查一般兩個字典是否相等?比較兩個字典與numpy的矩陣作爲值

>>> import numpy as np 
>>> A = {1: np.identity(5)} 
>>> B = {1: np.identity(5) + np.ones([5,5])} 
>>> A == B 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

編輯我知道numpy的矩陣應檢查其平等.all()。我正在尋找的是檢查此的一般方法,而不必檢查isinstance(np.ndarray)。這可能嗎?

相關信息不numpy的數組:

+0

我認爲你應該做的'A [1]。所有()== B [1]。所有()' – EdChum 2014-10-17 08:28:37

回答

1

考慮以下代碼

>>> import numpy as np 
>>> np.identity(5) 
array([[ 1., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0.], 
     [ 0., 0., 1., 0., 0.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 1.]]) 
>>> np.identity(5)+np.ones([5,5]) 
array([[ 2., 1., 1., 1., 1.], 
     [ 1., 2., 1., 1., 1.], 
     [ 1., 1., 2., 1., 1.], 
     [ 1., 1., 1., 2., 1.], 
     [ 1., 1., 1., 1., 2.]]) 
>>> np.identity(5) == np.identity(5)+np.ones([5,5]) 
array([[False, False, False, False, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False], 
     [False, False, False, False, False]], dtype=bool) 
>>> 

注意比較的結果是一個矩陣,而不是一個布爾值。字典比較將使用值CMP方法,這意味着,比較矩陣值的情況下,比較字典將得到的複合結果比較值。你想要做的是使用 numpy.all崩潰複合數組結果爲標布爾結果

>>> np.all(np.identity(5) == np.identity(5)+np.ones([5,5])) 
False 
>>> np.all(np.identity(5) == np.identity(5)) 
True 
>>> 

您需要編寫自己的函數來比較這些字典,測試值類型,看看他們是matricies,然後使用numpy.all進行比較,否則使用==。當然,你總是可以得到看中,並開始繼承字典和重載CMP,如果你想太多。

+0

我也不是很清楚關於這一點,但我希望在沒有明確檢查類型的情況下使用一般方法。今天這是一個數量龐大的陣列,明天它是我今天從未聽說過的類型。 – physicalattraction 2014-10-17 09:50:30

+0

我不認爲有一種解決辦法,恐怕。如果你的(或numpy或別人的)類型重載__cmp__返回一個非標量,標準的python比較將無法處理它。 – sirlark 2014-10-17 10:20:32