【发布时间】:2019-09-26 15:47:05
【问题描述】:
我有一个类 (MyClass),其属性为 data,它是一个 Numpy 数组。我想允许这样的操作:
myclass3 = myclass1 + myclass2
myclass3 = myclass1 + Numpy.ndarray
myclass3 = Numpy.ndarray + myclass1
所有这些操作将数据加在一起并返回一个新的 MyClass。所以通过定义add(),前两个很容易使用。但是对于最后一种情况,它的行为并不像我预期的那样,ndarray 用myclass1.data 逐个传递元素。
这就是我的意思。
import numpy as np
class MyClass:
def __init__(self, data):
self.data = data
def __add__(self, other):
print(other)
if isinstance(other, MyClass):
data = self.data + other.data
else:
data = self.data + other
return MyClass(data)
def __radd__(self, other):
print(other)
data = self.data + other
return MyClass(data)
myclass1 = MyClass(np.arange(5))
myclass2 = MyClass(np.ones(5))
nparray = np.arange(5) + 10
alist = [1, 1, 1, 1, 1]
在所有的加法组合中,即使alist + myclass1也都可以,但是nparray + myclass1返回:
In __radd__: 10
In __radd__: 11
In __radd__: 12
In __radd__: 13
In __radd__: 14
发生的事情是 Numpy 数组的每个元素都被一个一个地而不是整体地传递到 radd 中。它返回五次,我将res 作为<class 'numpy.ndarray'> 而不是MyClass 对象。
那么我怎样才能允许Numpy.ndarray + MyClass 操作,其中整个 ndarray 将像 radd() 中的其他一样传入。
最好的问候, J
【问题讨论】:
-
你为什么不从 ndarray 继承?
-
这可能只是为了 __rdd__() 而工作,但我担心这会变得太混乱。此外,构造函数需要与 ndarray 内联,这将涉及重大的 API 更改。对于已经发布的包,我认为这是矫枉过正。