Как заставить __radd__ работать с массивами numpy - PullRequest
3 голосов
/ 25 мая 2011

Рассмотрим следующий код Python:

class MyClass:
   def __radd__(self, a):
      print "foo", a
      return a

p = MyClass()

Чтобы вызвать radd, можно запустить следующее:

>>> print "bar"+p
foo bar
bar

Это ожидаемое поведение.__add__ запускается и дает сбой, поэтому __radd__ вступает во владение и обрабатывает ситуацию.Но с массивами numpy он ведет себя немного иначе:

>>> v = np.arange(2)
>>> print v+p
foo 0.
foo 1.
[0. 1.]

Кажется, что в отличие от приведенного выше примера v.__add__ итеративно проходит через компоненты v и выполняет на них p.__radd__.Другими словами, он решил, что возвращаемый тип будет ndarray (до тех пор, пока код не потерпит крах).Я понимаю, что это numpy, который пытается быть умным, но иногда я хотел бы, чтобы мой класс занимался арифметикой.

Возможно ли получить стандартное __radd__ поведение с numpy массивами?

1 Ответ

2 голосов
/ 25 мая 2011

Когда вы делаете a+b, обычно сначала получается, что это означает: b.__radd__ будет использоваться, только если a.__add__ не реализовано.Итак, в общем случае, если вы хотите контролировать сложение, вы должны убедиться, что ставите объект первым: b+a.

В соответствии с документами , однако, естьисключение к этому.Если вы создаете подкласс numpy.ndarray и определяете метод __radd__, то сначала его пробуют.Поэтому, если для вашего объекта имеет смысл основываться на массиве, вы можете это сделать.

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