作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个不均匀间隔的 (x,y) 值列表。 Here是这个问题中使用的存档。
我能够在值之间进行插值,但我得到的不是等距插值点。这是我的做法:
x_data = [0.613,0.615,0.615,...]
y_data = [5.919,5.349,5.413,...]
# Interpolate values for x and y.
t = np.linspace(0, 1, len(x_data))
t2 = np.linspace(0, 1, 100)
# One-dimensional linear interpolation.
x2 = np.interp(t2, t, x_data)
y2 = np.interp(t2, t, y_data)
# Plot x,y data.
plt.scatter(x_data, y_data, marker='o', color='k', s=40, lw=0.)
# Plot interpolated points.
plt.scatter(x2, y2, marker='o', color='r', s=10, lw=0.5)
结果是:
可以看出,在原始点分布较密集的图形部分,红点靠得更近。
我需要一种方法来根据给定的步长值(例如 0.1)在 x、y 中生成等距的插值
正如 askewchan 正确指出的那样,当我的意思是“在 x, y 中等间距”时,我的意思是曲线中两个连续的插值点应该彼此远离(欧几里德直线距离)相同的值。
我尝试了 unubtu 的答案,它适用于平滑的曲线,但对于不太平滑的曲线似乎会中断:
发生这种情况是因为代码以欧几里得方式而不是直接在曲线上计算点距离,我需要曲线上的距离在点之间相同。这个问题能以某种方式解决吗?
最佳答案
将您的 xy 数据转换为参数化曲线,即计算所有点之间的所有距离,并通过累积求和生成曲线上的坐标。然后相对于新坐标独立地插值 x 和 y 坐标。
import numpy as np
from matplotlib import pyplot as plt
data = '''0.615 5.349
0.615 5.413
0.617 6.674
0.617 6.616
0.63 7.418
0.642 7.809
0.648 8.04
0.673 8.789
0.695 9.45
0.712 9.825
0.734 10.265
0.748 10.516
0.764 10.782
0.775 10.979
0.783 11.1
0.808 11.479
0.849 11.951
0.899 12.295
0.951 12.537
0.972 12.675
1.038 12.937
1.098 13.173
1.162 13.464
1.228 13.789
1.294 14.126
1.363 14.518
1.441 14.969
1.545 15.538
1.64 16.071
1.765 16.7
1.904 17.484
2.027 18.36
2.123 19.235
2.149 19.655
2.172 20.096
2.198 20.528
2.221 20.945
2.265 21.352
2.312 21.76
2.365 22.228
2.401 22.836
2.477 23.804'''
data = np.array([line.split() for line in data.split('\n')],dtype=float)
x,y = data.T
xd = np.diff(x)
yd = np.diff(y)
dist = np.sqrt(xd**2+yd**2)
u = np.cumsum(dist)
u = np.hstack([[0],u])
t = np.linspace(0,u.max(),10)
xn = np.interp(t, u, x)
yn = np.interp(t, u, y)
f = plt.figure()
ax = f.add_subplot(111)
ax.set_aspect('equal')
ax.plot(x,y,'o', alpha=0.3)
ax.plot(xn,yn,'ro', markersize=8)
ax.set_xlim(0,5)
关于python - 如何生成等距插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19117660/
我是一名优秀的程序员,十分优秀!