[__ radd __()方法与Numpy Array一样,Numpy Array一次通过]

问题描述 投票:0回答:1

我有一个类(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 Array的每个元素一一而不是整体传递给radd。它返回五次,并且我将res作为<class 'numpy.ndarray'>而不是MyClass对象。

所以我怎么允许Numpy.ndarray + MyClass操作,整个ndarray将像在[[radd()中一样传递。

最好的问候,J
python arrays numpy
1个回答
2
投票
很遗憾,您对此无能为力。 alist + myclass1失败,因此它将调用您的__radd__函数,该函数可以正常工作。但是,在nparray + myclass1中,numpy尝试通过广播来避免失败。因此,它将等效于

for value in nparray.data: value + myclass

每次都会失败,然后

只有那时将被调用您的__radd__

© www.soinside.com 2019 - 2024. All rights reserved.