如何将7×12的2D数组按索引求和转为12长度的1D列表?
优化二维数组按列求和的Python实现
我在完成学校线性回归项目时,通过y = df["fatalProb"].values.reshape(7,12)生成了一个7×12的二维numpy数组,需要将其转换为长度为12的一维列表——对每个列索引位置的所有元素求和(例如把[[a,b,c], [d,e,f], [g,h,i]]转为[a+d+g, b+e+h, c+f+i])。之前写的列表推导式过于繁琐,这里提供几种更简洁高效的实现方法:
方法1:纯Python通用写法(zip+sum)
y = [sum(col) for col in zip(*y)]
原理:*y将二维数组解包为7个一维序列,zip会按位置把各序列的对应元素打包成元组(共12个元组,每个元组包含7个同列元素),再通过sum对每个元组求和,最终得到目标列表。这种写法不依赖第三方库,且不管数组行数多少都能通用,解决了原写法硬编码行索引的问题。
方法2:numpy高效写法(适合numpy数组)
因为y是numpy数组(由df.values.reshape生成),直接用numpy的向量运算效率更高:
y = y.sum(axis=0).tolist()
原理:sum(axis=0)指定按列求和,得到长度为12的numpy一维数组,再用tolist()转换为Python列表。数据量越大,这种方法的性能优势越明显。
方法3:函数式简洁写法(map+sum+zip)
如果偏好函数式风格,也可以用map替代列表推导式:
y = list(map(sum, zip(*y)))
原理和方法1完全一致,只是写法更紧凑。
原写法对比
原写法硬编码了7个行索引,扩展性差(比如行数变化时必须修改代码),而上面的方法都能自适应数组行数,代码简洁度和可维护性都更高。
内容的提问来源于stack exchange,提问作者MorningSnow
相关产品推荐
相关产品推荐

