在NumPy中,可以使用__array_priority__属性来控制作用于ndarray和用户定义类型的二进制运算符。例如:
class Foo(object):
def __radd__(self, lhs): return 0
__array_priority__ = 100
a = np.random.random((100,100))
b = Foo()
a + b # calls b.__radd__(a) -> 0
Run Code Online (Sandbox Code Playgroud)
但是,对于比较运算符而言,似乎不起作用。例如,如果将以下行添加到Foo,则永远不会从表达式中调用它a < b:
def __rlt__(self, lhs): return 0
Run Code Online (Sandbox Code Playgroud)
我意识到这__rlt__并不是Python的特殊名称,但我认为它可能有用。我尝试了所有的__lt__,__le__,__eq__,__ne__,__ge__,__gt__有和没有前面r,加上__cmp__了,但是我永远无法与NumPy调用它们。
这些比较可以覆盖吗?
为避免混淆,此处是NumPy行为的详细描述。首先,这是《 NumPy指南》书中所说的内容:
If the ufunc has 2 inputs and 1 output and the second input is an Object array
then a special-case …Run Code Online (Sandbox Code Playgroud) 所有,我有一个应用程序,当两个矩阵相乘时,它需要返回一个 numpy ndarray,而不是一个简单的总和;例如:
import numpy as np
x = np.array([[1, 1, 0], [0, 1, 1]])
y = np.array([[1, 0, 0, 1], [1, 0, 1, 0], [0, 0, 0, 0]])
w = x @ y
>>> array([[2, 0, 1, 1],
[1, 0, 1, 0]])
Run Code Online (Sandbox Code Playgroud)
但是,要求是返回一个 ndarray(在这种情况下..):
array([[[1,1,0], [0,0,0], [0,1,0], [1,0,0]],
[[0,1,0], [0,0,0], [0,1,0], [0,0,0]]])
Run Code Online (Sandbox Code Playgroud)
注意,矩阵乘法操作可能会重复;输出将用作下一个矩阵乘法运算的 ndarrays 的左侧矩阵,这将在第二个矩阵乘法运算后产生一个更高阶的 ndarray,等等。
有什么方法可以实现这一目标吗?我已经研究了重载__add__,并按照此处讨论的那样对__radd__np.ndarray进行了子类化,但主要是遇到了维度不兼容错误。
想法?
更新:
解决@Divakar 的答案 例如,对于链式操作,添加
z = np.array([[1, 1, 0], [0, 0, 0], [1, 0, …Run Code Online (Sandbox Code Playgroud)