Gab*_*iel 12 python interpolation numpy scipy
我有一个不均匀间隔的(x,y)值列表.这是此问题中使用的存档.
我能够在值之间进行插值,但我得到的不是等间隔插值点.这是我做的:
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)
Run Code Online (Sandbox Code Playgroud)
结果如下:
可以看出,红点在图的部分中更靠近在一起,其中原始点分布更密集.
我需要一种方法来根据给定的步长值(比如0.1)生成在x,y 中等间隔的插值点
正如askewchan正确指出的那样,当我的意思是" 在x,y 中等间隔 "时,我的意思是曲线中的两个连续插值点应该相互间隔(欧几里得直线距离)相同的值.
我尝试了unubtu的答案,它适用于平滑曲线,但似乎打破了不那么顺利的曲线:
这是因为代码,而不是直接在曲线上计算的欧几里德的方式点的距离,我需要的距离曲线上,是点之间是相同的.这个问题可以以某种方式解决吗?
Chr*_* K. 13
将xy数据转换为参数化曲线,即计算点之间的所有距离,并通过累积求和生成曲线上的坐标.然后相对于新坐标独立地插入x和y坐标.
import numpy as np
from pylab import plot
data = ''' 0.613 5.919
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(),20)
xn = np.interp(t, u, x)
yn = np.interp(t, u, y)
plot(x,y,'o')
plot(xn,yn,'gs')
xlim(0,5.5)
ylim(10,17.5)
Run Code Online (Sandbox Code Playgroud)
我们首先考虑一个简单的案例.假设您的数据看起来像下面的蓝线.
如果你想选择距离相等的等距点r
,那么对于r
(1,2)处的尖点是第一个等距点,会有一些临界值.
如果你想要大于这个临界距离的点,那么第一个等距点将从(1,2)跳到一个非常不同的地方 - 由绿色弧线与蓝色线的交点描绘.这种变化不是渐进的.
这个玩具案例表明,参数的微小变化r
会对解决方案产生根本的,不连续的影响.
它还建议您必须先知道第i个等距点的位置,然后才能确定第(i + 1)个等距点的位置.
因此,似乎需要一个迭代解决方案:
import numpy as np
import matplotlib.pyplot as plt
import math
x, y = np.genfromtxt('data', unpack=True, skip_header=1)
# find lots of points on the piecewise linear curve defined by x and y
M = 1000
t = np.linspace(0, len(x), M)
x = np.interp(t, np.arange(len(x)), x)
y = np.interp(t, np.arange(len(y)), y)
tol = 1.5
i, idx = 0, [0]
while i < len(x):
total_dist = 0
for j in range(i+1, len(x)):
total_dist += math.sqrt((x[j]-x[j-1])**2 + (y[j]-y[j-1])**2)
if total_dist > tol:
idx.append(j)
break
i = j+1
xn = x[idx]
yn = y[idx]
fig, ax = plt.subplots()
ax.plot(x, y, '-')
ax.scatter(xn, yn, s=50)
ax.set_aspect('equal')
plt.show()
Run Code Online (Sandbox Code Playgroud)
注意:我将纵横比设置'equal'
为使得点更加明显是等距的.