2016-06-27 14 views
0

Es ist am besten, anhand eines Beispiels zu zeigen. Ich nehme das Feld "Eigenschaften" aus einem Matplotlib-Plot. Es ist ein Wörterbuch mit verschiedenen Schlüsseln und Werten.Vergleichen Sie zwei Wörterbücher mit verschiedenen Datentypen als Werte

keys = gca().properties().keys 
ax1 = gca().properties() 

Dann Plotten ich etwas anderes und ich nehme eine andere Instanz

ax2 = gca().properties() 

Nimmt man nun an die gleichen Tasten gelten für ax2 (ich glaube, sie sind, da ich nicht die Plottyp geändert hat), wie kann ich die Werte ax1 und ax2 vergleichen? Diese Werte sind alle unterschiedliche Datentypen und der einfache Vergleich funktioniert nicht. Ich habe versucht,

for key in keys: 
    if ax1[key]!=ax2[key]: 
     print(key,ax1[key]) 

Worauf ich

bekommen
Traceback (most recent call last): 

    File "<ipython-input-46-363fb313494e>", line 2, in <module> 
    if ax1[key]!=ax2[key]: 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

ich tatsächlich den Namen und die Werte der Felder finden möchten, die zwischen den beiden Grundstücke sind unterschiedlich. Gibt es einen Weg, mit solch einer komplexen Datenstruktur umzugehen?

Antwort

0

Es scheint zu wissen, eingebaute deepdiff Funktion, die zwei Objekte und gehen in alle ihre Kind-Methoden, um die Unterschiede zu finden. Baue deine eigene Funktion.

1

Das Problem ist, dass numpy Arrays unterstützt nicht zu bool umgewandelt wird, so das Problem ist nicht der != Vergleich, sondern die Tatsache, dass die if Aussage versucht, die obejct zu bool konvertieren, um zu sehen, ob es True oder False und ist dieser Schritt, der fehlschlägt.

Der Trick besteht darin, zu prüfen, ob der Wert ein ndarray ist und wenn ja .all() oder .any() verwenden Sie das Ergebnis des Vergleichs zu bool konvertieren:

# assuming: import numpy as np 
for key in keys: 
    val1, val2 = ax1[key], ax2[key] 
    are_different = val1 != val2 
    if isinstance(val1, np.ndarray): 
     are_different = are_different.any() 

    if are_different: 
     print(key,ax1[key]) 

.any() Verwendung bedeutet, dass wenn ein einzelner Eintrag in Diese Arrays sind anders als sie als unterschiedlich angesehen werden. Ersetzen Sie es durch .all(), wenn Sie möchten, dass alle Einträge unterschiedlich sind.

+0

Die Antwort ist gültig, aber nach dem Versuch erkannte ich, dass die Ploteigenschaften sehr tief verschachtelt sind. Zum Beispiel ist die Linienfarbe bei 'gca(). Properties() ['lines'] [0] .get_color()'. Gibt es eine Möglichkeit, Linienfarben von zwei Plots (ax1 und ax2) zu vergleichen, ohne die Eigenschaft explizit zu benennen? Ich möchte alle Eigenschaften vergleichen und nur diejenigen finden, die unterschiedlich sind. – Aguy

+0

@Theguy Ja, aber wenn der Gleichheitsvergleich in diesen Datentypen korrekt implementiert ist, sollte der obige Code 'gca(). Properties() ['lines'] [0]' vergleichen und der Vergleich würde 'False' zurückgeben. Wenn die Gleichheit nicht korrekt implementiert wird, wird fast immer "False" zurückgegeben. In jedem Fall, wenn es nicht funktioniert oder wenn Sie einen detaillierteren Vergleich wünschen, müssen Sie weitere Spezialfälle hinzufügen und manuell tiefer gehen ... es gibt keine integrierte "make the Diff von zwei generischen Objekten" in Python. – Bakuriu

Verwandte Themen