为何Python内置sum()函数无需np.sum即可对numpy数组求和?
Python内置sum()对numpy数组求和的原理
你的推测完全正确,核心原因就是numpy的数组对象(ndarray)重写了加法魔术方法(__add__)。
具体过程拆解:
- 内置
sum()函数的工作逻辑是:默认以0作为初始累加值,遍历可迭代对象中的每个元素,依次执行累加值 = 累加值 + 当前元素的操作。 - 当第一个numpy数组(
array([1,2]))和初始值0相加时,会触发numpy数组的__add__方法——该方法会把0转换为兼容的numpy数组,再执行元素级加法,得到array([1,2])。 - 接着用这个结果和第二个numpy数组(
array([3,4]))相加,同样调用__add__方法执行元素级加法,最终得到array([4,6])。
验证方式:
你可以直接调用数组的__add__方法模拟这个过程,结果和sum()完全一致:
import numpy as np a1 = np.array([1,2]) a2 = np.array([3,4]) print(a1.__add__(a2)) # 输出 array([4,6]) # 运算符形式本质和调用__add__一致 print(a1 + a2)
另外需要注意:如果可迭代对象里混了普通整数,sum()依然能工作,因为numpy的__add__会自动做类型转换;但如果指定了非兼容的起始值,可能会报错。比如:
sum(a, start=1) # 会抛出TypeError,普通int和numpy数组无法直接相加
内容的提问来源于stack exchange,提问作者Karl Gardner
相关产品推荐
相关产品推荐

