芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

numpyデータが一致するかどうか

保存したnumpyのデータ,いくつかあったときに同じものだったかな~?と 曖昧な時に,そのnumpyのデータを比べて,まるっきり同じものかどうか調べたい
それでまず練習で以下をやってみた.

>>> import numpy as np
>>> a=np.array([1,2,3])
>>> b=np.array([1,2,3])
>>> a==b
array([ True,  True,  True])
>>> a=np.array([[1,2],[1,2]])
>>> b=np.array([[1,2],[1,2]])
>>> a==b
array([[ True,  True],
       [ True,  True]])
>>> type(a==b)
<class 'numpy.ndarray'>
>>> if a == b:
...     print("True")
... else:
...     print("False")
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

上記の通り,単純にa==bTrue(aとbは同じデータ)を返すわけではなく, 要素ごとに比較して新たに作成されたnumpyのデータ型が返されます.

>>> [j for i in a==b for j in i if j != True] == []
True
>>> if [j for i in a==b for j in i if j != True] == []:
...     print("True")
... else:
...     print("False")
...
True

なので,その返却されるnumpyのデータ型の中にFalseが一つでもあれば 異なるデータであることが分かるので上記のようにリスト内包表記を使って 確かめてみました. う~む,もっとスマートなやり方はないか...

また,サイズが違うもので比較すると以下のようになります.

>>> a=np.array([1,2])
>>> b=np.array([[1,2,3],[5,6,7]])
>>> a==b
__main__:1: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
False

上記の場合に[j for i in a==b for j in i if j != True] == []を行うと, 当然ではありますが,TypeError: 'bool' object is not iterableになります. 比較するもののサイズが分からない時はtry:~except TypeError:~で対処といったところかぁ.