You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:48:05