如何对矩阵中被0分隔的非零列段求和?求非循环实现方案
几种不用显式循环判断0的实现方案
根据你描述的矩阵结构(看起来要么是两行的二维矩阵,要么是包含多组非零元素的一维数组),这里提供几种不用手动循环判断0的替代方案:
情况1:矩阵是二维结构(每行对应一个求和组)
如果你的矩阵是两行,第一行包含A、B、C和大量0,第二行包含D、E和大量0,那最简单的方法就是直接对每行求和——因为0的存在不影响求和结果,完全不需要判断0:
比如用Python实现:
# 假设matrix是你的二维矩阵列表 matrix = [ [0, 0, 0, A, 0, 0, B, 0, C, 0, 0], [0, 0, 0, 0, D, 0, E, 0, 0] ] result = [sum(row) for row in matrix] # 输出就是[A+B+C, D+E]
如果用NumPy的话更高效:
import numpy as np matrix = np.array([ [0, 0, 0, A, 0, 0, B, 0, C, 0, 0], [0, 0, 0, 0, D, 0, E, 0, 0] ]) result = matrix.sum(axis=1).tolist()
情况2:矩阵是一维数组(非零元素分成两组,组间有连续0分隔)
如果你的数据是一维数组,且两组非零元素之间有一段连续的0(比如A、B、C和D、E之间有多个连续0,而组内非零元素之间只有单个或少量0),可以用NumPy的向量化操作来分组求和:
步骤如下:
- 找到所有非零元素的位置
- 通过计算相邻非零元素的索引差,找到分组的分界点
- 对两组非零元素分别求和
代码示例:
import numpy as np arr = np.array([0, 0, 0, A, 0, 0, B, 0, C, 0, 0, 0, 0, D, 0, E, 0]) # 获取非零元素的索引 non_zero_idx = np.nonzero(arr)[0] # 计算相邻索引的差值 idx_diff = np.diff(non_zero_idx) # 找到索引差超过阈值的位置(比如这里组间的索引差远大于组内的间隔) split_idx = np.where(idx_diff > 2)[0][0] + 1 # +1是因为diff的结果比原索引少一个元素 # 分组求和 group1_sum = arr[non_zero_idx[:split_idx]].sum() group2_sum = arr[non_zero_idx[split_idx:]].sum() result = [group1_sum, group2_sum]
情况3:已知非零元素的分组数量
如果已经明确知道第一组有3个非零元素、第二组有2个,那可以直接提取所有非零元素后切片求和:
arr = [0, 0, 0, A, 0, 0, B, 0, C, 0, 0, 0, 0, D, 0, E, 0] non_zero = [x for x in arr if x != 0] result = [sum(non_zero[:3]), sum(non_zero[3:])]
这个方法也完全不需要循环判断0,用列表推导式提取非零元素后直接求和。
内容的提问来源于stack exchange,提问作者Learning from masters
相关产品推荐
相关产品推荐

