是否有numpy函数可直接实现多数组元素加权逐元素求和?
NumPy 加权求和的直接实现方法及循环效率说明
1. 直接实现加权求和的NumPy函数
当然有,不用依赖np.average加补偿的技巧,这些方法更直接:
- 用
np.dot或np.tensordot:先把所有要加权的数组堆叠成高维数组,再和权重做点积:import numpy as np array_0 = np.array([ [1,2,3], [1,2,3], [1,2,3] ]) array_1 = np.array([ [1,2,3], [1,2,3], [1,2,3] ]) weights = np.array([1, 5]) # 堆叠数组成(2,3,3)形状 arrays = np.array([array_0, array_1]) # 直接计算加权求和 result = weights.dot(arrays) # 用tensordot也能得到相同结果 result = np.tensordot(weights, arrays, axes=1) - 用
np.einsum:通过爱因斯坦求和约定,灵活指定维度运算逻辑:
以上方法都能直接输出result = np.einsum('i,ijk->jk', weights, arrays)w1*A1 + w2*A2的结果,完全不需要额外处理步骤。
2. 关于循环次数的疑问
你的假设不成立,NumPy的向量化运算(包括你手写的array_0*weights[0] + array_1*weights[1])不会生成和操作数数量对应的循环。NumPy底层是用C实现的批量逐元素运算,所有乘法、加法操作会合并为一次底层循环(或优化的并行操作)执行,效率和用上述函数实现的完全一致,不用担心循环次数带来的性能损耗。
内容的提问来源于stack exchange,提问作者Zoltan K.
相关产品推荐
相关产品推荐

