复制Python int * numpy.array行为

3
我将尝试构建一个矩阵的类表示,包括大部分常见的数学运算。但是,在标量乘法操作中遇到了问题。
代码的相关部分如下:
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个回答

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

就像文档中所述,__r***__

被称为使用反射(交换)操作数来实现二进制算术运算的函数。只有在左操作数不支持相应的操作且操作数类型不同时才会调用这些函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接