1

次の例:

import numpy as np

class SimpleArray(np.ndarray):

    __array_priority__ = 10000

    def __new__(cls, input_array, info=None):
        return np.asarray(input_array).view(cls)

    def __eq__(self, other):
        return False

a = SimpleArray(10)
print (np.int64(10) == a)
print (a == np.int64(10))

次の出力が得られます

$ python2.7 eq.py
True
False

そのため、最初のケースでSimpleArray.__eq__は呼び出されません (常に を返す必要があるためFalse)。これはバグですか?もしそうなら、誰かが回避策を考えられますか? これが予期される動作でSimpleArray.__eq__ある場合、両方のケースで確実に呼び出されるようにするにはどうすればよいですか?

編集:明確にするために、これはNumpyスカラー配列でのみ発生します-通常の配列では、オブジェクトが等値演算のRHSにある場合でも常にこれを実行する必要があることをNumpyに伝える__eq__ため、常に呼び出されます:__array_priority____eq__

b = SimpleArray([1,2,3])

print(np.array([1,2,3]) == b)
print(b == np.array([1,2,3]))

与えます:

False
False

そのため、スカラー Numpy の「配列」では、__array_priority__尊重されないようです。

4

3 に答える 3

0

デフォルトでは、等式はwhereが variable のクラスをa == b呼び出します。これは、左オペランドの型によって、どの等値関数が呼び出されるかが決まることを意味します。作成した等価関数が確実に呼び出されるようにする唯一の方法は、変数が常に左側のオペランドであることを確認することです。ただし、左オペランドに等価関数がない場合、python は呼び出しを試みます。A.__eq__()AaB.__eq__()

于 2013-07-04T13:19:53.307 に答える