Numpy能否实现将一维数组元素与另一一维数组全部元素相加生成多组数组
等价Numpy实现方案
你要实现的是两个一维数组元素两两相加、每行对应x中单个元素与y所有元素求和的逻辑,用Numpy广播机制可以完全通过向量化操作实现,彻底避免Python层面的循环,性能提升非常显著。
实现代码如下:
import numpy as np # 生成Numpy数组替代range生成的列表 x = np.arange(50) y = np.arange(120) # 利用广播直接生成结果矩阵,每一行就是你需要的foo # x[:, np.newaxis]会把x从(50,)的一维数组转为(50, 1)的列向量,和(120,)的y相加时自动做广播匹配 result = x[:, np.newaxis] + y # 如果需要逐行打印,直接遍历结果矩阵的行即可 for row in result: print(row)
性能说明
- 你之前用
np.nditer没有观察到性能提升,是因为本质还是在Python层面做迭代,没有用到Numpy的向量化特性。上述实现的加法是在C层面执行的ufunc运算,没有Python循环开销,规模越大性能优势越明显,比纯Python列表推导+循环的实现快几十到上百倍都很常见。 - 如果你的后续操作不需要逐行处理,完全可以直接对整个
result矩阵做批量操作,性能会进一步提升。 - 如果数据规模过大(比如单块结果矩阵超过可用内存),可以把x拆分成多个小批次分别计算,避免内存溢出。
内容的提问来源于stack exchange,提问作者TPack
相关产品推荐
相关产品推荐

