在numpy中重新定义*=运算符

Bas*_*asj 4 python arrays numpy subclass

正如这里这里提到的,这在numpy 1.7+中不再起作用:

import numpy
A = numpy.array([1, 2, 3, 4], dtype=numpy.int16)
B = numpy.array([0.5, 2.1, 3, 4], dtype=numpy.float64)
A *= B
Run Code Online (Sandbox Code Playgroud)

解决方法是:

def mult(a,b):
    numpy.multiply(a, b, out=a, casting="unsafe")

def add(a,b):
    numpy.add(a, b, out=a, casting="unsafe")

mult(A,B)
Run Code Online (Sandbox Code Playgroud)

但这对于每个矩阵操作来说都太长了!

如何在*=默认情况下覆盖numpy 运算符来执行此操作?

我应该继承一些东西吗?

ali*_*i_m 6

您可以使用np.set_numeric_ops覆盖数组算术方法:

import numpy as np

def unsafe_multiply(a, b, out=None):
    return np.multiply(a, b, out=out, casting="unsafe")

np.set_numeric_ops(multiply=unsafe_multiply)

A = np.array([1, 2, 3, 4], dtype=np.int16)
B = np.array([0.5, 2.1, 3, 4], dtype=np.float64)
A *= B

print(repr(A))
# array([ 0,  4,  9, 16], dtype=int16)
Run Code Online (Sandbox Code Playgroud)