2014-10-17 19 views
5

Voglio dire che due dizionari Python sono uguali (ciò significa: uguale quantità di chiavi e ogni mappatura da chiave a valore è uguale, l'ordine non è importante). Un modo semplice sarebbe assert A==B, tuttavia, questo non funziona se i valori dei dizionari sono numpy arrays. Come posso scrivere una funzione per verificare in generale se due dizionari sono uguali?Confronto di due dizionari con matrici numpy come valori

>>> 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() 

EDIT sono consapevole che le matrici NumPy devono essere controllati per l'uguaglianza con .all(). Quello che sto cercando è un modo generale per verificare questo, senza dover controllare isinstance(np.ndarray). Sarebbe possibile?

Argomenti correlati senza array NumPy:

+0

Penso che si dovrebbe fare 'A [1] .Tutte() == B [1] .Tutte()' – EdChum

risposta

1

considerare questo codice

>>> 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) 
>>> 

Annotare il risultato del confronto è una matrice, non un valore booleano. I confronti di Dict confronteranno i valori usando i valori cmp metodi, il che significa che quando si confrontano i valori delle matrici, il confronto di dict otterrà un risultato composito. Che cosa si vuole fare è utilizzare numpy.all al collasso il risultato di matrice composita in un risultato booleano scalare

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

Si avrebbe bisogno di scrivere la propria funzione per confrontare questi dizionari, i tipi di valore di prova per vedere se sono da matrici, e poi confrontando usando numpy.all, altrimenti usando ==. Certo, puoi sempre essere fantasioso e iniziare sottoclasse dict e sovraccarico cmp se lo vuoi anche tu.

+0

non ero molto chiaro a tale proposito, ma speravo in un modo generale senza verificare esplicitamente il tipo. Oggi è una matrice numpy, domani è un tipo di cui non ho mai sentito parlare oggi. – physicalattraction

+0

Non credo che ci sia un modo per aggirarlo, temo. Se i tipi (o numpy o di qualcun altro) sovrascrivono __cmp__ per restituire un confronto python standard non scalare, non lo gestiranno. – sirlark