无迭代实现一维数组中零值分隔段数值的质心及位置计算
一维序列非零段质心计算方案
首先修正示例数组的无效语法:原代码中05不符合Python整数书写规则,修改为5即可。
完整实现代码
import numpy as np a = np.array([0,0,0,8,13,12,5,0,0,0,5,6,8,14,0,0,0]) # 生成非零值掩码 mask = a != 0 # 为每个连续非零段分配唯一整数标签,零值区域标签统一为0 padded_mask = np.pad(mask, (1, 1), constant_values=False) labels = np.cumsum(np.diff(padded_mask) == 1) * mask # 计算质心所需的分组统计量,全程使用向量化操作无迭代 indices = np.arange(len(a)) # 分组数值总和 sum_vals = np.bincount(labels, weights=a) # 分组 位置*数值 总和 sum_pos_vals = np.bincount(labels, weights=indices * a) # 过滤零值区域,计算最终结果 valid_mask = sum_vals != 0 # 优先输出的质心位置(原数组坐标) centroid_positions = sum_pos_vals[valid_mask] / sum_vals[valid_mask] # 对应质心数值 centroid_values = sum_vals[valid_mask] / np.bincount(labels)[valid_mask]
结果说明
- 质心位置采用标准一维数值加权平均规则计算:
质心位置 = Σ(位置i * 数值i) / Σ数值i - 示例数组的计算结果为2段非零区域的对应值:
- 第一段(位置3~6,数值[8,13,12,5]):质心位置约为
4.316,质心数值为9.5 - 第二段(位置10~13,数值[5,6,8,14]):质心位置约为
11.848,质心数值为8.25
- 第一段(位置3~6,数值[8,13,12,5]):质心位置约为
- 所有运算均为numpy向量化实现,无任何显式迭代逻辑,大数组下性能表现优异
内容的提问来源于stack exchange,提问作者Spartak Goga
相关产品推荐
相关产品推荐

