2016-06-27 5 views
0

例で示すのが最適です。私はmatplotlibプロットから "プロパティ"フィールドを取っています。これは、異なるキーと値を持つ辞書です。さまざまなデータ型の2つの辞書を値として比較します。

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

は、それから私は何か他のものをプロットしていると私は今、同じキーがAX2のために有効であると仮定すると、別のインスタンスに

ax2 = gca().properties() 

を取る(私は彼らがいると思う、私はプロットタイプを変更していないので、 )、ax1とax2の値をそれぞれどのように比較できますか?これらの値はすべて異なるデータ型であり、単純な比較は機能しません。私は、私は実際には二つのプロットの間で異なっているフィールドの名前と値を見つけたい

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

を取得するには

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

を試してみました。このような複雑なデータ構造を扱う方法はありますか?

答えて

0

組み込みのdeepdiff関数が2つのオブジェクトをとり、その違いを見つけるためにすべての子メソッドに入っていることが分かります。独自の機能を構築する。

1

問題はnumpy配列は、 はそう問題は!=比較けどif文はそれがあるかどうかを確認するboolにobejctを変換しようとしているという事実はないboolに変換されてサポートしていないということですTrueまたはFalse失敗するこのステップです。

トリック値がndarrayあるので、boolとの比較の結果を変換する.all()又は.any()を使用している場合か否かをチェックすることである。

# 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()手段を用いて、単一のエントリであればそれらの配列は異なるので、それらは異なると見なされます。すべてのエントリが異なるようにする場合は、.all()に置き換えてください。

+0

答えは有効ですが、試した後でプロットプロパティが非常に深くネストされていることがわかりました。例えば、線の色は 'gca()。properties()['lines'] [0] .get_color()'です。明示的にプロパティの名前を付けることなく、2つのプロット(ax1とax2)の線の色を比較する方法はありますか?私はすべてのプロパティを比較して、異なるものだけを探したい。 – Aguy

+0

@Theguyはい、これらのデータ型で等価比較が適切に実装されている場合、上記のコードは 'gca()。properties()['lines'] [0]'と比較し、比較は 'False'を返します。等価が適切に実装されていない場合、ほとんど常に 'False'が返されます。いずれにしても動作しない場合や、より詳細な比較が必要な場合は、特殊なケースを追加して手作業で作業を進める必要があります... Pythonには「組み込みの2つの汎用オブジェクトを作成する」ことはありません。 – Bakuriu

関連する問題