Python scipy 插值网格数据

问题描述

亲爱的,我想插入一个实验数据,以使其看起来具有更高的分辨率,但显然它不起作用。我按照此 link 中的示例获取了 mgrid 数据,可以找到 csv 数据,如下所示。

Csv data

我的代码

import pandas as pd
import numpy as np
import scipy    

x=np.linspace(0,2.8,15)
y=np.array([2.1,2,1.9,1.8,1.7,1.6,1.5,1.4,1.3,1.2,1.1,0.9,0.7,0.5,0.3,0.13])
[X,Y]=np.meshgrid(x,y)

Vx_df=pd.read_csv("Vx.csv",header=None)
Vx=Vx_df.to_numpy()

tck=scipy.interpolate.bisplrep(X,Y,Vx)

plt.pcolor(X,Vx,shading='nearest');
plt.show()

xi=np.linspace(0.1,2.5,30)
yi=np.linspace(0.15,2.0,50)

[X1,Y1]=np.meshgrid(xi,yi)

VxNew = scipy.interpolate.bisplev(X1[:,0],Y1[0,:],tck,dx=1,dy=1)

plt.pcolor(X1,Y1,VxNew,shading='nearest')
plt.show()

CSV 数据:

0.73,-0.08,-0.19,-0.06,0.02,0.27,0.35,0.47,0.64,0.77,0.86,0.90,0.93
0.84,0.13,0.03,0.12,0.23,0.32,0.52,0.61,0.72,0.83,0.91,0.96,0.95
1.01,1.47,0.46,0.48,0.51,0.65,0.74,0.80,0.89,0.99,1.07,1.06
1.17,1.39,1.51,1.19,1.02,0.95,1.01,1.05,1.06,1.11,1.13,1.19
1.22,1.36,1.42,1.44,1.23,1.24,1.17,1.18,1.14,1.09,1.08,1.19
1.21,1.30,1.35,1.37,1.43,1.33,0.98,1.15
1.14,1.22,1.25,1.16,1.00,0.93,0.82,1.03,0.97,0.94,0.84,0.68,0.66,0.06,0.25,0.42,0.55,0.49,0.56,0.40,0.28,0.01,0.05,0.33,0.37,0.29,0.30,-0.02,0.07,0.15,0.21,0.22,0.20,0.19,0.17,-0.07,-0.05,0.16,0.11,0.08,-0.13,-0.14,-0.09,-0.03,-0.01,0.00,0.04,-0.16,-0.23,-0.21,-0.10,-0.11,-0.17,-0.25,-0.29,-0.32,-0.31,-0.33,-0.34,-0.36,-0.35,-0.26,-0.24,-0.39,-0.45,-0.52,-0.48,-0.41,-0.43,-0.37,-0.22,

低分辨率(无插值)的图像为Low resolution,插值后得到的图像为High resolution

你能给我一些建议吗?为什么它不能正确插值?

解决方法

好的,为了进行插值,我们需要设置一个输入和输出网格,并且可能需要从网格中删除缺失的值。我们就是这样做的

array = pd.read_csv(StringIO(csv_string),header=None).to_numpy()

def interp(array,scale=1,method='cubic'):
    x = np.arange(array.shape[1]*scale)[::scale]
    y = np.arange(array.shape[0]*scale)[::scale]
    x_in_grid,y_in_grid = np.meshgrid(x,y)
    x_out,y_out = np.meshgrid(np.arange(max(x)+1),np.arange(max(y)+1))
    array = np.ma.masked_invalid(array)
    x_in = x_in_grid[~array.mask]
    y_in = y_in_grid[~array.mask]
    return interpolate.griddata((x_in,y_in),array[~array.mask].reshape(-1),(x_out,y_out),method=method)

现在我们需要调用这个函数 3 次。首先我们用样条插值填充中间的缺失值。然后我们用最近邻插值填充边界值。最后,我们通过将像素解释为相距几个像素并使用样条插值填充间隙来调整大小。

array = interp(array)
array = interp(array,method='nearest')
array = interp(array,50)
plt.imshow(array)

我们得到以下结果 final picture