Python:interp2d 得到相同且错误的值

问题描述 投票:0回答:1

我有一个 3*3 的表,所以我的预期是使用

interp2d
插值,然后预测更大的表(可能是 5*5 或 10*10)以获得更多结果,然后在
plot_surface

中显示
  1. 这是一个简单的3*3表,用于测试和关系:
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 tabble
#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()```
python numpy matplotlib scipy interpolation
1个回答
0
投票

你是在推断而不是插值。根据文档,默认功能是使用最接近的值。由于所有新值最接近 (1,0.05) 点,因此它对所有点使用 -1。

© www.soinside.com 2019 - 2024. All rights reserved.