复制Python int * numpy.array行为

时间:2015-05-17 14:34:51

标签: python numpy

我正在尝试使用大多数正常的数学运算来构建矩阵的类表示。我在标量乘法运算中遇到了麻烦。

代码的相关部分如下:

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)))

标量乘法的标准方式是cA,其中c是标量,A是矩阵,因此Python中为c*A。但是,如果TypeError: unsupported operand type(s) for *: 'int' and 'Matrix' A*c按预期运行,则会失败(请注意other*self.array)。因此,我得出结论,*操作数是为intnumpy.array定义的。

这是什么魔法,我怎样才能复制这种行为?

1 个答案:

答案 0 :(得分: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***__

一样
  调用

来实现具有反射(交换)操作数的二进制算术运算。仅当左操作数不支持相应操作且操作数类型不同时,才会调用这些函数。