我有一个33的表,所以我的预期是使用interp2d
插值,然后预测一个更大的表,可能是55或1010,以获得更多的结果,然后显示在plot_surface
中
1.这是一个简单的33表,用于测试和关系:
x = np.array([1, 2,3]) #---X,Y,Z relationship------
y = np.array([0.05, 0.5,1]) #(1, 0.05, -1.0)(1, 0.5, -0.5)(1, 1.0, 2.0)
z = np.array([-1, -0.5,2,\ #(2, 0.05, -2.0)(2, 0.5, 1.5)(2, 1.0, 3.5)
-2, 1.5,3.5, #(3, 0.05, -1.5)(3, 0.5, 2.5)(3, 1.0, 5.0)
-1.5,2.5,5])
字符串
1.为了实现这种关系,我设置:
X,Y=np.meshgrid(x,y,indexing='ij')
Z=z.reshape(len(x),len(y))
型
1.根据当前数据内插5*5表格
#interp2d Z value
f2 = interp2d(x,y,Z,kind='linear')
x_new=np.linspace(0.01,0.02,5)
y_new=np.linspace(0.002,0.004,5)
X_new,Y_new=np.meshgrid(x_new,y_new,indexing='ij')
z_new=f2(x_new,y_new)
Z_new=z_new.reshape(len(x_new),len(y_new))
print(z_new)
型
现在,在这一步,我得到了错误的插值Z值,所有相同的和预期的
# [-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]]
型
**最终3D表面变成平面图
我不知道为什么脚本或function interp2d
的错误。
我该如何修复scipts?**
这是我的完整脚本:
from scipy.interpolate import interp1d,interp2d,griddata
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
x = np.array([1, 2,3])
y = np.array([0.05, 0.5,1])
z = np.array([-1, -0.5,2,\
-2, 1.5,3.5,
-1.5,2.5,5])
fig = plt.figure()
ax=Axes3D(fig)
ax = fig.add_subplot(projection='3d')
X,Y=np.meshgrid(x,y,indexing='ij')
Z=z.reshape(len(x),len(y))
#interp2d Z value
f2 = interp2d(x,y,Z,kind='linear')
x_new=np.linspace(0.01,0.02,5)
y_new=np.linspace(0.002,0.004,5)
X_new,Y_new=np.meshgrid(x_new,y_new,indexing='ij')
z_new=f2(x_new,y_new)
Z_new=z_new.reshape(len(x_new),len(y_new))
print(z_new) #---->not as expected [[-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]]
#This is for check X,Y,Z value
def Check():
n,j=0,0
print("----X,Y,Z-----")
for i in zip(X.flat,Y.flat,Z.flat): #----X, Y, Z - ----
print(i, end=" ") #(1, 0.05, -1.0)(1, 0.5, -0.5)(1, 1.0, 2.0
n += 1 #(2, 0.05, -2.0)(2, 0.5, 1.5)(2, 1.0, 3.5)
if n % int(len(x))==0: #(3, 0.05, -1.5)(3, 0.5, 2.5)(3, 1.0, 5.0)
print()
print("----X_new,Y_new,Z_new-----")
for i in zip(X_new.flat,Y_new.flat,Z_new.flat):
print(i, end=" ")
j += 1
if j % int(len(x_new))==0:
print()
Check()
ax.plot_surface(X, Y, Z,linewidth=0,antialiased=True,cmap="cividis",rstride=1,cstride=1)
ax.plot_surface(X_new, Y_new, Z_new, linewidth=0, antialiased=True, cmap=cm.winter, rstride=1, cstride=1)
plt.show()```
型
1条答案
按热度按时间gg58donl1#
您正在外推而不是插值。根据documentation,默认功能是使用最接近的值。由于所有新值都最接近(1,0.05)点,因此它对所有点使用-1。