__radd __ () с Numpy Array, как и другие, Numpy Array передавался один за другим - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть класс (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 былперешел в радд один за другим, а не в целом.И он возвращается пять раз, и я получил res как <class 'numpy.ndarray'>, а не MyClass объект.

Так как я могу разрешить Numpy.ndarray + MyClass операцию, когда весь ndarray будет проходить как другой в радд ().

С наилучшими пожеланиями, J

1 Ответ

2 голосов
/ 26 сентября 2019

К сожалению, вы ничего не можете с этим поделать.alist + myclass1 завершается ошибкой, поэтому он вызывает вашу __radd__ функцию, которая работает как задумано.Но в nparray + myclass1 NumPy пытается избежать сбоев путем трансляции.Таким образом, он будет делать эквивалент

for value in nparray.data:
    value + myclass

, который будет каждый раз терпеть неудачу, и только тогда будет вызван ваш __radd__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...