numpy标量乘法实现原理是什么?Python原生标量与numpy数组相乘如何运行?
Numpy标量左乘的运行逻辑解答
你对Python乘法运算符默认调度逻辑的理解是对的:x * y默认会优先调用左操作数的__mul__方法,也就是x.__mul__(y),但这并不是完整的调度规则:
- 当左操作数的
__mul__方法无法处理右操作数的类型时,会返回特殊的NotImplemented常量 - 此时Python会自动触发反向运算逻辑,调用右操作数的
__rmul__方法,传入左操作数作为参数,也就是执行y.__rmul__(x)
你给出的示例代码运行流程如下:
x = 6 y = np.array([1,2]) print(x * y)
- 首先执行原生int类型实例
6的__mul__方法,传入numpy数组作为参数。int类型的原生实现不支持和numpy数组做乘法,直接返回NotImplemented - Python检测到左操作数的乘法方法返回了
NotImplemented,转而调用numpy数组的__rmul__方法,传入6作为参数 - Numpy的ndarray类已经内置实现了
__rmul__方法,逻辑和正向的标量乘数组完全一致:会把输入的标量广播到数组的每个元素对应相乘,最终输出[6 12]
Numpy就是通过实现这类反向运算符方法,实现了非numpy类型的标量在运算符左侧时,也能按照numpy的广播规则完成运算。类似的反向方法还有__radd__、__rsub__、__rtruediv__等,覆盖了所有常用二元运算符。
内容的提问来源于stack exchange,提问作者Koh Jia Hng
相关产品推荐
相关产品推荐

