86805


エラーの回避はどうしたらいいでしょうか？  
ndarray以外のオブジェクトに関してもリストで管理して、リストになければ登録するという実装を他にもしていています。これだけ例外にしなくてはいけなくて萎えています。  
具体的には以下のような利用をしています。

[code]

    if not(obj in objList):
        objList.append(obj)
    
[/code]

現状はUserListを継承したクラスでappendメソッドをオーバーライドする方向で考えています。  
コードを書き直す元気がでないので、エラーについての解説や回避方法や実装方法についてアドバイスあれば助かります。

[code]

    import numpy as np
    a = np.array([1,2])
    b = np.array([1,2])
    c = a
    d = [a,b,c]
    print(a in d) #->True
    print(b in d) #->Error
    # ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
    print(c in d) #->True
    
[/code]


CC BY-SA 4.0
2022-03-12T00:48:35.327
86804
2022-03-12T04:59:11.017
2022-03-12T04:59:11.017
3060
51798
question
python numpy
ndarrayオブジェクトのin演算子による存在判定のエラーについて


コメントにある対応方法の他にも、[類似質問の回答](https://ja.stackoverflow.com/a/39224/9820)のように`(b==d).all(axis=1).any()`と記述することで回避できます。  
上のリンク先は`np.array`の二次元配列ですが、組み込みのlist型でも同様に対応可能です。

なお、`ValueError: The truth value of an array with more than one element is
ambiguous. Use a.any() or
a.all()`エラーの原因は英語でambiguousと書かれているように、判定の条件があいまいだからです。

公式ドキュメントの[帰属検査演算](https://docs.python.org/ja/3.6/reference/expressions.html#in)には下記の記述があります。

> 式 `x in y` は `any(x is e or x == e for e in y)`と等価です。

上の通りに`any(b is x or b == x for x in d)`と記述しても`b == x`でエラーとなります。  
numpyの仕様として、組み込みのlist型に対して上記の比較を行った際にはわざとエラーを発生させているようです。

参考資料：  
[numpyやpandasでThe truth value of ... is
ambiguous.のようなエラーが出たときの対処](https://www.haya-
programming.com/entry/2019/03/15/235259)


CC BY-SA 4.0
2022-03-12T02:03:44.290
86805
2022-03-12T02:03:44.290
9820
86804
answer