如何不使用for循环实现不同维度数组的指定规则乘法运算
无循环实现方案
直接用数值计算库的广播机制即可实现,全程没有Python层面的for循环,运行效率远高于手写循环。
实现逻辑
要得到A的9个元素与B的15个元素逐对相乘的结果,只需要对两个数组做维度拓展触发广播运算,再调整维度顺序即可:
- 给形状为
(100000,9)的A新增中间维度,得到形状(100000, 1, 9) - 先对形状为
(15,100000)的B做转置,再新增末尾维度,得到形状(100000, 15, 1) - 两个拓展后的数组广播逐元素相乘,得到形状为
(100000, 15, 9)的中间结果 - 合并后两个维度后转置,即可得到目标形状
(135, 100000)的最终结果
代码示例(基于NumPy)
import numpy as np # 生成测试数组 A = np.random.rand(100000, 9) B = np.random.rand(15, 100000) # 维度拓展+广播相乘 A_ext = A[:, np.newaxis, :] B_ext = B.T[:, :, np.newaxis] mid_result = A_ext * B_ext # 维度调整得到目标输出 final_result = mid_result.reshape(100000, -1).T
验证说明
相乘后合并的15*9=135刚好匹配目标数组的第一个维度,所有运算均调用计算库底层优化实现,没有Python层面的循环开销,处理十万级长度的数组性能表现优异。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

