python分段线性插值

时间:2018-02-22 11:16:47

标签: python 3d scipy interpolation

我试图创建一个分段线性插值例程,而且我对这一切都很陌生,所以我很不确定需要做什么。

我在3D中生成了一组数据点,这些数据点在所有3个方向上都有变化。我想在这些数据点之间插值并在3D中绘图。

当前数据集比最终数据集小得多。线性插值很重要。

这是当前的代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import scipy.interpolate as interp


x = np.linspace(-1.3,1.3,10)
y1 = np.linspace(.5,0.,5)
y2 = np.linspace(0.,.5,5)
y = np.hstack((y1,y2))
z1 = np.linspace(.1,0.,5)
z2 = np.linspace(0.,.1,5)
z = np.hstack((z1,z2))

data = np.dstack([x,y,z])

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')


f = interp.interp2d(x, y, z, kind='linear')
xnew = np.linspace(-1.3,1.3,100)
y1new = np.linspace(.5,0.,50)
y2new = np.linspace(0.,.5,50)
ynew = np.hstack((y1new,y2new))
znew = f(xnew,ynew)

ax.plot(x,y,znew, 'b-')
ax.scatter(x,y,z,'ro')
plt.show()

正如我所说,数据集只是为了增加变化。实际组合会更大但变化更小。我不太了解插值工具,scipy文档也不是很清楚

会很感激建议

1 个答案:

答案 0 :(得分:0)

2D确定。请帮助3D

我正在尝试做的是构建一些东西,它采用数据点进行光束偏转和数据点之间的插值。我想在3D中得到这个并得到一个3D图,同时显示沿y轴和z轴方向的x轴偏转。作为一个间隙测量,我使用下面的代码分别显示y dir和z dir的偏差。注意,数据集是暂时随机生成的。有些选择在mo中可能看起来很奇怪,但这样才能确定最终数据集将使用的范围。以下代码适用于2D系统,因此可能对某人有所帮助。如果有人可以帮我在3D中做到这一点,我仍然非常感激。

import numpy as np
import matplotlib.pyplot as plt

from scipy.interpolate import CubicSpline

u=10


x = np.linspace(-1.3,1.3,u) #regular x-data 
y = np.random.random_sample(u)/4 #random y data 
z = np.random.random_sample(u)/10 # random zdata 
ynone = np.ones(u)*0.1 #no deflection dataset
znone = np.ones(u)*0.05

xspace = np.linspace(-1.3, 1.3, u*100)


ydefl = CubicSpline(x, y) #creating cubinc spline function for original data
zdefl = CubicSpline(x, z)


plt.subplot(2, 1, 1)
plt.plot(x, ynone, '-',label='y - no deflection')
plt.plot(x, y, 'go',label='y-deflection data')
plt.plot(xspace, ydefl(xspace), label='spline') #plot xspace vs spline         function of xspace
plt.title('X [m]s')
plt.ylabel('Y [m]')
plt.legend(loc='best', ncol=3)

plt.subplot(2, 1, 2)
plt.plot(x, znone, '-',label='z - no deflection')
plt.plot(x, z, 'go',label='z-deflection data')
plt.plot(xspace, zdefl(xspace),label='spline')
plt.xlabel('X [m]')
plt.ylabel('Z [m]')
plt.legend(loc='best', ncol=3)

plt.show()

enter image description here