如何生成等间隔插值

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)


unu*_*tbu 8

我们首先考虑一个简单的案例.假设您的数据看起来像下面的蓝线.

在此输入图像描述

如果你想选择距离相等的等距点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'为使得点更加明显是等距的.