子数组中两点之间的等距点
我有一个矩阵,里面表示了一些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()
输出结果: