2015-05-17 4 views
3

Я пытаюсь построить представление класса матрицы, полное большинства нормальных математических операций. Я ударил с помощью операции скалярного умножения.Дублирование Python int * numpy.array поведение

Соответствующая часть кода выглядит следующим образом:

import numpy 

class Matrix(object): 

    def __init__(self, array): 
     self.array = numpy.array(array, dtype=int) 

    def __mul__(self, other): 
     if type(other) == int: 
      return Matrix(other*self.array) 
     else: 
      raise ValueError("Can not multiply a matrix with {0}".format(type(other))) 

Стандартный способ выражается скалярное умножение сА, где с является скаляром и А является матрицей, так c*A в Python. Однако это не удается с TypeError: unsupported operand type(s) for *: 'int' and 'Matrix', а A*c работает как ожидалось (обратите внимание на other*self.array). Таким образом, я делаю вывод, что операнд * определен для int и numpy.array.

Что это за магия и как я могу воспроизвести поведение?

ответ

5

Вам нужны __rmul__ в ваших заготовках. Например, если добавить

def __rmul__(self, other): 
    return self.__mul__(other) 

тогда:

>>> A = Matrix(np.arange(12).reshape(3, 4)) 
>>> (2 * A).array 
array([[ 0, 2, 4, 6], 
     [ 8, 10, 12, 14], 
     [16, 18, 20, 22]]) 

Как и в docs, то __r***__

призваны выполнять двоичные арифметические операции с отраженным (поменялись) операнды. Эти функции вызывается только в том случае, если левый операнд не поддерживает соответствующую операцию, а операнды имеют разные типы.

+0

Спасибо! Это сработало. – Kendas

Смежные вопросы