子数组中两点之间的等距点

-1 投票
1 回答
38 浏览
提问于 2025-04-14 17:20

我有一个矩阵,里面表示了一些xy坐标点:

这里插入图片描述

第一列是x坐标,第二列是y坐标,第三列是控制列(值为1的就是控制值)。我需要创建一个新列,这个新列的值是直接连接控制列中值为1的点,并在它们之间插入一些插值点。新列的长度要和原来的列一样。

我尝试用np.linspace来处理每一段在1之间的部分,但我希望能一次性完成,而不是一个一个循环数组。

数据可以从这个链接下载。

1 个回答

1

我觉得你想用 np.interp 这个函数:

# random data
np.random.seed(1)
x = np.random.rand(20) * 10
y = np.random.rand(20) * 10
z = np.random.choice([0,1], size=20)

m = np.array([x,y,z]).transpose()
# ensure z starts and ends with 1
m[[0,-1],-1] = 1

# non-zero rows
xp = np.where(m[:,-1])[0]
# all the rows
x = np.arange(len(m))

# interpolate
out = np.array([np.interp(x, xp, fp=m[xp,0]),
                np.interp(x, xp, fp=m[xp,1]),
              ]).T

输出结果:

array([[4.17022005, 8.00744569],
       [3.78792194, 7.64603918],
       [3.40562383, 7.28463267],
       [3.02332573, 6.92322616],
       [1.46755891, 8.76389152],
       [1.66508051, 4.80716682],
       [1.86260211, 0.85044211],
       [3.45560727, 0.39054783],
       [4.42188731, 4.58598643],
       [5.38816734, 8.78142503],
       [4.27361906, 9.04724846],
       [3.15907078, 9.31307188],
       [2.0445225 , 9.5788953 ],
       [8.78117436, 5.33165285],
       [0.27387593, 6.91877114],
       [2.22346198, 6.89189021],
       [4.17304802, 6.86500928],
       [5.58689828, 8.34625672],
       [3.78395659, 7.92384993],
       [1.98101489, 7.50144315]])

你可以这样来可视化数据:

plt.figure(figsize=(10,6))
plt.scatter(m[:,0], m[:,1], marker='x',s=100, label='old')
plt.plot(m[xp,0], m[xp,1], '--', label='none zero')
plt.scatter(out[:,0], out[:,1], marker='o', label='interpolate')
plt.legend()

输出结果:

在这里输入图片描述

撰写回答