【问题标题】:Redefine *= operator in numpy在 numpy 中重新定义 *= 运算符
【发布时间】:2023-04-03 12:53:01
【问题描述】:

作为 mentioned herehere,这在 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

解决方法是:

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)

但是对于每个矩阵运算来说太长了!

如何默认覆盖numpy *= 操作符来做到这一点?

我应该继承一些东西吗?

【问题讨论】:

  • A *= B 仅比mult(A,B) 节省了 3 个字符。你能清楚地说明为什么你需要尽可能短的方法吗?
  • @SethMMorton:比隐式更好*= 是所有主要编程语言的标准;必须定义 mult 函数是不自然的
  • 你希望A 在这里结束什么?
  • @Eric 因为A 是一个int 数组,而我们确实就地*=,我希望A 最后保持一个int。

标签: python arrays numpy subclass


【解决方案1】:

您可以使用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)

【讨论】:

    【解决方案2】:

    您可以创建一个通用函数并将预期的属性传递给它:

    def calX(a,b, attr):
        try:
            return getattr(numpy, attr)(a, b, out=a, casting="unsafe")
        except AttributeError:
            raise Exception("Please enter a valid attribute")
    

    演示:

    >>> import numpy
    >>> A = numpy.array([1, 2, 3, 4], dtype=numpy.int16)
    >>> B = numpy.array([0.5, 2.1, 3, 4], dtype=numpy.float64)
    >>> calX(A, B, 'multiply')
    array([ 0,  4,  9, 16], dtype=int16)
    >>> calX(A, B, 'subtract')
    array([ 0,  1,  6, 12], dtype=int16)
    

    请注意,如果您想覆盖结果,您可以将函数的返回值分配给第一个矩阵。

    A = calX(A, B, 'multiply')
    

    【讨论】:

    • 很好,但这并不比mult(A,B)def mult(a,b): numpy.multiply(a, b, out=a, casting="unsafe") 短...我想要的是覆盖A*=B
    • @Basj 这是一种通用的方式,它使您不必为所有操作定义一个函数。你也不需要覆盖任何东西。
    • @Basj 如果您坚持使用就地运算符,您最好创建一个自定义矩阵对象并手动定义它的运算符,您仍然需要为所有运算符执行此操作。
    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多