gpt4 book ai didi

python - ndarray 子类的相等性未按预期工作

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:59 24 4
gpt4 key购买 nike

以下示例:

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标量数组中 - 对于普通数组,__eq__总是被调用,因为__array_priority__告诉Numpy 应该始终执行此 __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__ 似乎没有得到尊重。

最佳答案

这是介于 bug 和疣之间的情况。当您调用a op b并且ba的子类时,Python会检查b是否有反射op 的版本并调用它(__eq__ 是其自身的反射版本),例如这个 np.array(10) == a给出了预期的结果,因为 SimpleArray 是 ndarray 的子类。但是,由于 SimpleArray 不是 np.int64 的实例,因此它在您提供的示例中不起作用。实际上,这可能很容易解决问题,因此您可以考虑将其添加到邮件列表中。

关于python - ndarray 子类的相等性未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17471176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com