我有兴趣从代码库中+
的实现中了解NumPy中的广播如何工作。
当在NumPy中写入a + b
时,程序如何理解+
的含义?
虽然我在/numpy/numpy/array_API/_array_object.py中找到了__add__
方法,但我不清楚+
如何触发此方法:
def __add__(self: Array, other: Union[int, float, Array], /) -> Array:
"""
Performs the operation __add__.
"""
other = self._check_allowed_dtypes(other, "numeric", "__add__")
if other is NotImplemented:
return other
self, other = self._normalize_two_args(self, other)
res = self._array.__add__(other._array)
return self.__class__._new(res)
字符串
3条答案
按热度按时间svdrlsy41#
方法
__add__
被称为dunder(“双下划线”)或魔术方法。__add__
用于为任何类的+
操作符定义行为,而不仅仅是在Numpy中,并且您不需要做任何特殊的事情来使+
触发__add__
。几乎所有的操作员都有类似的神奇方法。
来自Python文档(https://docs.python.org/3/reference/datamodel.html#object.%5F%5Fadd%5F%5F):
要计算表达式x + y,其中x是具有__add__()方法的类的示例,类型(x).add(x,y)被调用。
g52tjvyc2#
Python运算符重载和Python数据模型是可以让你更清楚一点的主题。
更简洁地说,当你调用one_thing + another_thing时,python解释器会调用
one_thing.__add__(another_thing)
,但是如果one_thing没有实现__add__
,解释器会尝试another_thing.__radd__(one_thing)
。否则你会得到一个Exception。当然,你可以实现你自己版本的
__add__
方法,当你这样做的时候,你的对象就能够处理“+”加运算符了,这就是你的问题的例子中发生的事情。下面你可以看到这样的例子:
ryevplcw3#
看看NDArrayOperatorsMixin,特别是这里。它说它使用array_ufunc。这是它如何将运算符Map到方法。此外,请看这里和这里以及这里,看看它实际上是如何处理的。如果你想有更深入的了解,那么你需要自己调试。
以下是截至2023年11月18日的mixins.py的原始代码:
字符串