NumPy中+运算符与np.add()的区别是什么?
你给出的测试代码如下:
import numpy as np a = np.arange(10) b = a + 1 c = np.add(a, 1) print("a:", a) print("b:", b) print("c:", c)
运行输出为:
a: [0 1 2 3 4 5 6 7 8 9] b: [ 1 2 3 4 5 6 7 8 9 10] c: [ 1 2 3 4 5 6 7 8 9 10]
a + 1 与 np.add(a, 1) 的核心区别 你测试的场景中二者输出完全一致,是因为numpy对数组的加法运算符做了重载,a + 1 底层默认就是调用np.add实现的,普通二元加法场景下二者效果没有差异,核心区别仅存在于特殊需求场景:
- 可选参数支持能力不同
np.add是numpy的标准通用函数(ufunc),支持多个实用的可选参数,运算符加法没有这些能力:- 支持
out参数:可以直接将计算结果写入预先分配好的数组,不需要额外开辟新内存,适合大数组运算的性能优化,用法示例:
- 支持
# 预先分配内存 res = np.empty(10) # 结果直接写入res,不需要生成临时数组 np.add(a, 1, out=res)
- 支持
where参数:可以指定仅对符合条件的位置执行加法运算,用法示例:
# 仅给a中大于5的元素加1,其余位置保持原值 np.add(a, 1, out=a.copy(), where=a>5)
- 作为函数传递的便利性不同
np.add本身是可调用的函数对象,可以直接作为参数传入高阶函数(比如map、数组批量处理函数等)使用,而+是运算符,需要封装为匿名函数才能传递,示例:
# np.add直接作为函数传入 list(map(np.add, [1,2,3], [4,5,6])) # 运算符加法需要额外封装lambda list(map(lambda x,y: x+y, [1,2,3], [4,5,6]))
- 非numpy数组输入的处理逻辑不同
如果运算对象不是numpy数组而是Python原生容器,二者行为不同:- 对原生列表执行
[1,2,3] + 1会直接抛出类型错误,Python原生不支持列表与整数相加 - 执行
np.add([1,2,3], 1)会自动将输入转为numpy数组后运算,返回array([2, 3, 4])
- 对原生列表执行
日常简单加法运算场景下,a + 1写法更简洁可读性更高,优先使用即可,只有需要用到ufunc特殊参数、或者需要传递加法函数的场景下,才需要显式调用np.add。
内容的提问来源于stack exchange,提问作者Mojtaba Arezoomand
相关产品推荐
相关产品推荐

