日々精進

新しく学んだことを書き留めていきます

Pythonでオブジェクト==で比較すると「{ValueError}The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()」エラー

発生条件は以下。

  • @dataclassの付いたclassのオブジェクトを==で比較する
  • そのclassのインスタンス変数にnumpy.ndarrayがある

原因は以下。

@dataclassで自動生成されるeqメソッドは、そのクラスのフィールドからなるタプルを比較する

参考: docs.python.org

ndarray同士の比較結果は、各要素毎の比較結果を格納したndarrayになることがある。

参考: nishidy.hatenablog.com

なのでタプルの要素の一つにnumpy.ndarrayがあると、ndarray同士の比較の結果、ndarrayが生成され、結果がboolでないのでエラーになる。

今回は値が同じかでなく、オブジェクトが同じかを確認したかったのでid(obj)でオブジェクトのIDを取得して比較するよう修正した。

参考:

qiita.com