gpt4 book ai didi

python - 如何使用 numpy 数组正确调用 `__rsub__` ?

转载 作者:行者123 更新时间:2023-12-01 00:27:57 24 4
gpt4 key购买 nike

考虑以下代码片段:

import numpy as np

class MyClass:
def __rsub__(self, other):
print(type(other), other)

obj = MyClass()
arr = np.ones(3)

arr - obj

我希望它打印 <class 'numpy.ndarray'> [1. 1. 1.] 。但实际上,好像是调用__rsub__对于每个元素:

<class 'float'> 1.0
<class 'float'> 1.0
<class 'float'> 1.0

有没有办法告诉 numpy 我想要第一个行为,即将整个减法委托(delegate)给 MyClass

最佳答案

在 NumPy 1.13+ 上,您可以使用 NumPy 特定的 Hook 来执行此操作,但您不能拥有 __rsub__击败__sub__一般方法。

<小时/>

__rsub__如果左操作数的 __sub__ 则尝试无法处理该操作,但左操作数可以处理该操作。 NumPy 数组的 __sub__将接受任何 RHS 并执行广播减法。您的对象的 __rsub__仅对广播减法中的各个操作起作用。

有一种非常有限的情况,__rsub__首先尝试,如果 RHS 的类是 LHS 类的子类。从技术上讲,您可以对 numpy.ndarray 进行子类化,但这会带来很多额外的负担,而且对于 numpy.matrix([[1]]) - obj 仍然没有任何作用。或其他子类。

没有办法说“我希望我的 __rsub__ 战胜一切”。它不存在,它的存在也没有意义,因为如果你试图减去两个都想声明其方法胜过一切的对象,会发生什么?

<小时/>

这就是一般情况。不过,特别是对于 NumPy,您可以连接 numpy.ndarray.__sub__ 的机制。代表们。

NumPy 数组委托(delegate) __sub__到 NumPy ufunc机械。那里有一堆奇怪的自定义选项,但我们对一个特定选项的具体使用感兴趣:通过设置 __array_ufunc__ None在类级别,您可以声明与 ufunc 不兼容的类。这意味着所有 NumPy 运算符重载都将返回 NotImplemented ,让你的类处理该操作。这会影响所有运算符和更多东西,但以您可能想要的方式:

class MyClass:
__array_ufunc__ = None
def __rsub__(self, other):
print(type(other), other)

如果你想要比阻止所有 ufunc 更有针对性的东西,你可以实现一个实际的 __array_ufunc__方法,只处理 ufunc 是减法并且类的实例是 RHS 的情况:

class MyClass:
def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
if ufunc is not numpy.subtract:
return NotImplemented
if method != '__call__':
return NotImplemented
if len(inputs) != 2 or inputs[1] is not self:
return NotImplemented
if kwargs:
return NotImplemented
return self.__rsub__(inputs[0])
def __rsub__(self, other):
print(type(other), other)

关于python - 如何使用 numpy 数组正确调用 `__rsub__` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58408999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com