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

8nuwlpux  于 9个月前  发布在  Python
关注(0)|答案(1)|浏览(156)

我有一个33的表,所以我的预期是使用interp2d插值,然后预测一个更大的表,可能是55或1010,以获得更多的结果,然后显示在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表格

#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()```

gg58donl

gg58donl1#

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

相关问题