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

在数组中对控制点间的XY坐标进行无循环等距插值

无循环实现控制点间的等距插值

假设你的数据已加载为numpy数组data(N×3结构,第一列x坐标、第二列y坐标、第三列标记控制点,值为1),以下是完全基于向量化操作的解决方案,无需循环即可生成插值后的新列:

1. 提取控制点核心信息

先定位所有控制点的索引及对应坐标:

import numpy as np

# 定位控制点索引
ctrl_indices = np.where(data[:, 2] == 1)[0]
# 获取控制点的x、y值
ctrl_x = data[ctrl_indices, 0]
ctrl_y = data[ctrl_indices, 1]

2. 生成区间插值参数

计算相邻控制点间的元素数量,再生成每个点对应的插值进度(0到1的等距值):

# 计算每段控制点间的点数
segment_lengths = np.diff(ctrl_indices)
# 为每个区间生成等距插值比例(不含终点,避免重复计算)
t_segments = [np.linspace(0, 1, num=length, endpoint=False) for length in segment_lengths]
# 拼接所有区间的比例,并补上最后一个控制点的1
t = np.concatenate(t_segments)
t = np.append(t, 1)

3. 向量化完成插值计算

利用numpy广播机制,一次性计算所有点的插值结果:

# 为每个点分配所属的控制点区间ID
segment_ids = np.repeat(np.arange(len(ctrl_indices)-1), segment_lengths)
segment_ids = np.append(segment_ids, len(ctrl_indices)-1)

# 计算插值后的x、y坐标
interp_x = ctrl_x[segment_ids] + t * (ctrl_x[segment_ids + 1] - ctrl_x[segment_ids])
interp_y = ctrl_y[segment_ids] + t * (ctrl_y[segment_ids + 1] - ctrl_y[segment_ids])

# 将插值结果作为新列拼接到原数据
result_data = np.hstack([data, interp_x.reshape(-1, 1), interp_y.reshape(-1, 1)])

关键说明

  • 全程使用numpy内置的向量化函数,避免了显式循环,处理大数据量时效率远高于循环实现。
  • 若需要非线性插值,只需修改t的生成逻辑(比如替换为二次/三次曲线的参数),核心的区间分配与广播计算逻辑无需改动。

内容的提问来源于stack exchange,提问作者user2727167

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:48:23