相关疑难解决方法(0)

如何覆盖NumPy的ndarray和我的类型之间的比较?

在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)

python numpy operators

5
推荐指数
1
解决办法
861
查看次数

Numpy - 矩阵乘法返回 ndarray,而不是总和

所有,我有一个应用程序,当两个矩阵相乘时,它需要返回一个 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)

python numpy multidimensional-array matrix-multiplication

2
推荐指数
1
解决办法
712
查看次数