如何用向量化方法在NumPy数组不同位置插入不同长度数组?
解决NumPy插入不同长度NaN数组报错及3D点间隙插值问题
为什么np.insert会报错?
np.insert的values参数要求输入的数组具有统一形状,你传入的是行数各异的np.full((size,3), np.nan)列表,每个子数组形状不均,无法构建均匀结构的数组,因此触发ValueError。
向量化插入NaN数组的方案
无需循环调用np.insert,可以直接构建目标数组并填充原数据:
import numpy as np # 假设已完成前期处理:nadir(清理NaN后的数组)、gaps、sizes total_length = len(nadir) + sizes.sum() # 创建全NaN的目标数组 extended_nadir = np.full((total_length, 3), np.nan) # 计算原数据在目标数组中的索引位置 offsets = np.zeros(len(nadir), dtype=int) # 为每个间隙后的原数据索引添加偏移量 for idx, gap_pos in enumerate(gaps): offsets[gap_pos + 1:] += sizes[idx] # 将原数据填充到目标数组的对应位置 extended_nadir[np.arange(len(nadir)) + offsets] = nadir
更高效的直接插值方案(无需先插NaN)
你的最终目标是填充间隙,完全可以跳过插入NaN的步骤,直接在间隙处生成插值点并拼接数组,推荐使用scipy.interpolate.interp1d实现线性插值:
import numpy as np from scipy.interpolate import interp1d # 前期处理(和你原代码一致) nadir = nadir[~np.isnan(nadir).any(axis=1)] dists_between_points = np.linalg.norm(np.diff(nadir[:, :2], axis=0), axis=1) dist = np.mean(dists_between_points) gaps = np.where(dists_between_points > dist)[0] sizes = (dists_between_points[gaps] // dist).astype(int) # 构建最终数组 final_points = [nadir[0]] for i in range(len(nadir) - 1): current_point = nadir[i] next_point = nadir[i+1] if i in gaps: # 获取当前间隙需要插入的点数 insert_count = sizes[np.where(gaps == i)[0][0]] # 生成插值参数,取0到1之间的insert_count个点 t = np.linspace(0, 1, insert_count + 2)[1:-1] # 对x、y、z三个维度进行线性插值 interpolator = interp1d([0, 1], np.vstack([current_point, next_point]), axis=0) interpolated_points = interpolator(t) final_points.append(interpolated_points) final_points.append(next_point) # 拼接所有点得到结果 final_nadir = np.vstack(final_points)
这个方法直接生成插值后的点,避免了先插NaN再插值的冗余步骤,计算效率更高,同时也解决了np.insert的形状问题。
内容的提问来源于stack exchange,提问作者bt3
相关产品推荐
相关产品推荐

