Numpy计算两个数组所有两两相除结果平均值 求更优雅实现方案
优化实现方案
数学原理推导
你需要计算的是数组a中所有元素x和数组b中所有元素y两两组合的x/y的平均值,这个计算可以直接通过代数拆解简化:
假设a长度为m,b长度为n,所有配对的总个数为m*n,所有x/y的总和可以拆分为:
Σ(x∈a, y∈b) x/y = (Σx∈a x) * (Σy∈b 1/y)
因此平均值可以推导为:
平均值 = 总和/(m*n) = (Σx/m) * (Σ(1/y)/n) =a的均值 * (b所有元素倒数的均值)
numpy实现代码
仅需要一行代码即可完成计算,不需要生成任何中间配对数组,内存复杂度从原实现的O(mn)降低到O(m+n),大数组下性能提升极其明显:
import numpy as np a = np.array([1,2,3]) b = np.array([4,5]) result = np.mean(a) * np.mean(1 / b)
用你的示例验证:a的均值为2,b元素倒数的均值为(0.25+0.2)/2=0.225,相乘得到结果0.45,和原实现完全一致。
注意事项
如果b数组中存在0元素,计算时会触发numpy的除零警告,该行为和你原有实现逻辑一致,若业务场景需要规避可提前过滤b中的零值。
内容的提问来源于stack exchange,提问作者steliosbl
相关产品推荐
相关产品推荐

