如何对Numpy数组按行分别求和偶数列与奇数列?
解决NumPy按行对奇偶索引列求和的问题
我来帮你搞定这个问题!你遇到的核心问题是没有指定求和的轴方向,而且误用了Python内置的sum()函数,导致得到的是列维度的总和,而不是你需要的每行单独求和的结果。
问题分析
你的代码里用了sum(lines[:,::2]),这里的sum是Python内置函数,它会把NumPy数组当成可迭代对象,沿着第一个轴(行)对每一列的元素累加,最终得到的是列的总和数组,而不是每行的求和结果。这就是为什么你得到的d_dn.size和d_up.size和原数组行数(301)完全不匹配的原因。
正确实现步骤
要实现你想要的“每行保留第一个元素,再分别对奇数索引列、偶数索引列(除第一个外)求和”的需求,我们需要用NumPy的np.sum()并指定axis=1参数,明确告诉它按行对列元素求和。
完整代码示例
import numpy as np # 模拟你的输入数组(这里用你给出的样例数据) lines = np.array([ [-18.29750213, 0.1, -0.1, 0.4, -0.8], [-18.20350213, 0.7, -0.2, 0.1, -0.3], [-18.11050213, 0.5, -0.6, 0.2, -0.1], [9.49249787, 0.5, -0.6, 0.2, -0.2], [9.58649787, 0.3, -0.3, 0.7, -0.8], [9.67949787, 0.2, -0.6, 0.5, -0.1] ]) # 1. 提取每行的第一个元素(列0) col0 = lines[:, 0] # 2. 对每行的奇数索引列(列1、3)求和,axis=1表示按行求和 sum_odd_cols = np.sum(lines[:, 1::2], axis=1) # 3. 对每行的偶数索引列(列2、4)求和 sum_even_cols = np.sum(lines[:, 2::2], axis=1) # 4. 拼接三个数组,得到每行对应的结果:[列0值, 奇数列和, 偶数列和] result = np.column_stack((col0, sum_odd_cols, sum_even_cols)) # 按你想要的格式打印结果 for row in result: print(f"{row[0]} {row[1]}({row[1]:.1f}即原行奇数列和) {row[2]}({row[2]:.1f}即原行偶数列和)")
输出结果(样例部分)
-18.29750213 0.5(0.5即原行奇数列和) -0.9(-0.9即原行偶数列和) -18.20350213 0.8(0.8即原行奇数列和) -0.5(-0.5即原行偶数列和) -18.11050213 0.7(0.7即原行奇数列和) -0.7(-0.7即原行偶数列和) ...
关键知识点
np.sum()的axis参数:axis=1表示沿着列的方向求和(即对每行的元素求和),返回的数组长度和原数组的行数一致(你的情况是301);如果不指定axis,默认会把整个数组扁平化后求和,得到一个标量。- 避免混用Python内置
sum()和NumPy数组:Python的sum()对NumPy数组的处理逻辑和np.sum()不同,它会迭代数组的第一个轴,最终得到列的总和,这不是你需要的结果。
内容的提问来源于stack exchange,提问作者BaRud
相关产品推荐
相关产品推荐

