2014-10-17 20 views
5

Ich möchte feststellen, dass zwei Python-Wörterbücher gleich sind (das heißt: gleiche Anzahl von Schlüsseln, und jede Zuordnung von Schlüssel zu Wert ist gleich; Reihenfolge ist nicht wichtig). Ein einfacher Weg wäre assert A==B, dies funktioniert jedoch nicht, wenn die Werte der Wörterbücher numpy arrays sind. Wie kann ich allgemein eine Funktion schreiben, um zu prüfen, ob zwei Wörterbücher gleich sind?Vergleichen zweier Wörterbücher mit numpy Matrizen als Werte

>>> 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 Ich bin mir bewusst, dass numpy Matrizen werden mit .all() auf Gleichheit geprüft werden. Was ich suche, ist eine allgemeine Möglichkeit, dies zu überprüfen, ohne zu überprüfen isinstance(np.ndarray). Wäre das möglich?

Verwandte Themen ohne numpy Arrays:

+0

Ich glaube, du vermeintlichen zu tun A [1] .all() == B [1] .all() ' – EdChum

Antwort

1

diesen Code Betrachten

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

Hinweis das das Ergebnis des Vergleichs ist eine Matrix, kein boolescher Wert Dict-Vergleiche vergleichen Werte unter Verwendung der Werte cmp Methoden, was bedeutet, dass beim Vergleichen von Matrixwerten der dict-Vergleich ein zusammengesetztes Ergebnis erhalten wird. Was Sie tun möchten, ist die Verwendung numpy.all der Verbund-Array in einem skalaren boolean Ergebnis führen zusammenzubrechen

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

Sie benötigen würde Ihre eigene Funktion zu schreiben, diese Wörterbücher, Typen Testwert zu vergleichen, um zu sehen, ob sie Matrizes sind, und dann Vergleichen unter Verwendung numpy.all, andernfalls unter Verwendung ==. Natürlich können Sie immer fancy und starten Sie Unterklasse dict und überladen cmp wenn Sie auch wollen.

+0

Ich war nicht ganz klar, darüber, aber ich hatte auf einen allgemeinen Weg gehofft, ohne explizit nach Typ zu suchen. Heute ist es ein numpliges Array, morgen ist es ein Typ, von dem ich noch nie gehört habe. – physicalattraction

+0

Ich glaube nicht, dass es einen Weg gibt, fürchte ich. Wenn Ihre Typen (oder Numpys oder jemandes anderen) __cmp__ überschreiben, um einen Nicht-Skalarwert zurückzugeben, werden Standard-Python-Vergleiche nicht damit umgehen. – sirlark

Verwandte Themen