如何快速向Numpy一维数组的指定索引位置插入数值?
NumPy一维数组移除NaN后重建的性能优化方案
性能瓶颈说明
- 原有实现中循环调用
np.insert会每次都重新分配数组内存、全量复制原有数据,待插入索引数量较多时时间复杂度为O(n²),是耗时过长的核心原因 - 初始遍历查找NaN索引的Python原生循环效率远低于NumPy向量化操作
优化实现
1. 索引记录与有效数据提取
# 向量化判断NaN位置,无需遍历 is_nan = np.isnan(zf) # 分别获取NaN索引、有效数据索引 inds_nan = np.where(is_nan)[0] inds_valid = np.where(~is_nan)[0] # 直接用索引提取有效数组,比np.delete效率更高 zphas_f = zf[inds_valid] xf_f = xf[inds_valid] yf_f = yf[inds_valid]
2. 原有后处理逻辑可保持不变
xy_f = np.concatenate((xf_f[None,:],yf_f[None,:], np.ones(xf_f.shape)[None,:]), axis=0 ).transpose() xy_inv_f = np.linalg.pinv(xy_f) abc_f = np.matmul(xy_inv_f, zphas_f[:,None] ) rem_plane = np.matmul(xy_f, abc_f) z_dd = zphas_f - rem_plane.transpose()[0] # 绘图逻辑保持不变即可
3. 数组重建(毫秒级完成,替换原有循环插入逻辑)
无需循环插入,直接批量赋值即可:
# 初始化和原数组等长的数组,直接填充待回填的默认值(此处为0,若要填NaN可改用np.full_like(zf, np.nan)) z_dd_f_rec = np.zeros_like(zf) # 批量将处理后的有效值放入对应索引位置 z_dd_f_rec[inds_valid] = z_dd
优化后整个重建步骤没有Python层面的循环,全部是NumPy底层向量化操作,即使是百万级长度的数组也可以在毫秒级完成,完全避免数分钟的等待。
内容的提问来源于stack exchange,提问作者Pooja Thakkar
相关产品推荐
相关产品推荐

