如何在Python中对三维numpy数组的同位置子数组求和
解决方案
针对你提出的三维numpy数组求和需求,这里提供几种高效的实现方式:
方法1:分步使用numpy的sum函数
利用numpy的轴求和特性,先合并三个二维数组对应位置的元素,再对子数组内部求和:
import numpy as np # 构造输入数组 arr = np.array([[[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 5]], [[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 5]], [[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 5]]]) # 先沿轴0合并三个二维数组的对应元素,再沿轴1对子数组求和 result = arr.sum(axis=0).sum(axis=1).tolist() print(result) # 输出: [9, 18, 27, 36, 45]
方法2:一次性指定多轴求和(更简洁)
直接通过指定多个求和轴,一步完成计算:
result = arr.sum(axis=(0, 1)).tolist() print(result) # 输出: [9, 18, 27, 36, 45]
原理说明
axis=0:将三个二维数组中对应位置的元素相加,得到形状为(5, 3)的数组,每个子数组变为[3,3,3]、[6,6,6]等;axis=1:对每个子数组内部的元素求和,最终得到长度为5的结果数组;tolist():将numpy数组转换为普通Python列表。
方法3:纯Python列表循环实现(适合小数据量)
如果不想依赖numpy,也可以用原生Python循环完成:
arr_list = arr.tolist() result = [] # 遍历每个子数组的位置 for idx in range(len(arr_list[0])): total = 0 # 累加三个二维数组中对应子数组的和 for sub_arr in arr_list: total += sum(sub_arr[idx]) result.append(total) print(result) # 输出: [9, 18, 27, 36, 45]
注意事项
当数组规模较大时,优先使用numpy的方法,其底层基于C实现,效率远高于纯Python循环。
内容的提问来源于stack exchange,提问作者foy
相关产品推荐
相关产品推荐

