我有一个 3*3 的表,所以我的预期是使用
interp2d
插值,然后预测更大的表(可能是 5*5 或 10*10)以获得更多结果,然后在 plot_surface
中显示
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])
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)
现在在这一步我得到了错误数量的插图 Z 值,全部相同并且不是预期的
# [-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]
# [-1. -1. -1. -1. -1.]]
最终3D表面变成平面图片
我不知道为什么脚本或
function interp2d
有问题。这是我的完整脚本:
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,0.05) 点,因此它对所有点使用 -1。