Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 忽略nan值的二维插值_Python_Matplotlib_Scipy_Interpolation - Fatal编程技术网

Python 忽略nan值的二维插值

Python 忽略nan值的二维插值,python,matplotlib,scipy,interpolation,Python,Matplotlib,Scipy,Interpolation,如何让interp2d忽略nan值 我有一个曲面x和y,具有任意值z x = np.array([[9.19632, 9.62141, 10.0829, np.isnan, np.isnan], [9.21164, 9.64347, 10.1392, 10.5698, np.isnan], [9.22175, 9.65439, 10.1423, 10.6301, 11.0323], [9.21632, 9.67060, 10.1474, 10

如何让interp2d忽略nan值

我有一个曲面x和y,具有任意值z

x =   np.array([[9.19632, 9.62141, 10.0829, np.isnan, np.isnan],
        [9.21164, 9.64347, 10.1392, 10.5698,  np.isnan],
        [9.22175, 9.65439, 10.1423, 10.6301, 11.0323],
        [9.21632, 9.67060, 10.1474, 10.6230, 11.0818]])

y =  np.array([[11.5466,11.6485,11.7619, np.isnan, np.isnan],
        [12.4771, 12.5460, 12.5453, 12.7142, np.isnan],
        [13.5578, 13.5581, 13.5505, 13.5309, 13.6081],
        [14.5653, 14.5504, 14.5036, 14.5145, 14.5060]])

z = np.array([[0.466113, 0.0484404, -0.385355, np.isnan, np.isnan],
        [0.366125, -0.160165, -0.548668, -0.888301,np.isnan],
        [-0.0970777, -0.346734, -0.826576, -1.08412, -1.33129],
        [-0.259981, -0.586938, -1.03477, -1.32384, -1.61500]])

我已经能够使用遮罩阵列生成上面的彩色网格,但是当我尝试使用2d插值创建更精细的网格时,我失败了。下面是我到目前为止所做的,请注意,我将nan值设置为零以获得该值,因此很明显,它会弄乱“正确”的插值。相反,我希望忽略它们,并将参数留空

f = interp.interp2d(x,y,z, kind='linear')
xnew = np.arange(9,11.5, 0.01)
ynew = np.arange(9,15, 0.01)
znew = f(xnew, ynew)


levels = np.linspace(zmin, zmax, 15)
plt.ylabel('Y', size=15)
plt.xlabel('X', size=15)
cmap = plt.cm.jet_r
cmap.set_bad('white',0.1) # set nan to white
cs = plt.contourf(xnew, ynew, znew, levels=levels, cmap=cmap)
cbar = plt.colorbar(cs)
cbar.set_label('Z', rotation=90, fontsize=15) # gas fraction
plt.show()


我想简单地创建一个平滑的彩色图,其中x和y绑定的区域根据z着色。

我不知道为什么interp2d在不规则间隔的数据上有问题,我建议使用griddata,您可以使用
ravel
将输入数据平放到向量中,然后消除NaN,并将其用作griddata的输入,你会得到这样的东西

代码与您拥有的代码没有太大区别

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

x =   np.array([[9.19632, 9.62141, 10.0829,np.isnan,np.isnan],
    [9.21164, 9.64347, 10.1392, 10.5698,np.isnan],
    [9.22175, 9.65439, 10.1423, 10.6301, 11.0323],
    [9.21632, 9.67060, 10.1474, 10.6230, 11.0818]])

y =  np.array([[11.5466,11.6485,11.7619,np.isnan,np.isnan],
    [12.4771, 12.5460, 12.5453, 12.7142,np.isnan],
    [13.5578, 13.5581, 13.5505, 13.5309, 13.6081],
    [14.5653, 14.5504, 14.5036, 14.5145, 14.5060]])

z = np.array([[0.466113, 0.0484404, -0.385355,np.isnan,np.isnan],
    [0.366125, -0.160165, -0.548668, -0.888301,np.isnan],
    [-0.0970777, -0.346734, -0.826576, -1.08412, -1.33129],
    [-0.259981, -0.586938, -1.03477, -1.32384, -1.61500]])

x=x.ravel()              #Flat input into 1d vector
x=list(x[x!=np.isnan])   #eliminate any NaN
y=y.ravel()
y=list(y[y!=np.isnan])
z=z.ravel()
z=list(z[z!=np.isnan])


xnew = np.arange(9,11.5, 0.01)
ynew = np.arange(9,15, 0.01)
znew = griddata((x, y), z, (xnew[None,:], ynew[:,None]), method='linear')



levels = np.linspace(min(z), max(z), 15)
plt.ylabel('Y', size=15)
plt.xlabel('X', size=15)
cmap = plt.cm.jet_r
cs = plt.contourf(xnew, ynew, znew, levels=levels, cmap=cmap)
cbar = plt.colorbar(cs)
cbar.set_label('Z', rotation=90, fontsize=15) # gas fraction
plt.show()

如果您必须外推数据(请查看下面的注释),您可以使用
SmoothBivariateSpline
并使用样条线的顺序,我不推荐使用它,我会告诉您原因

代码与您最初的代码更接近

from scipy.interpolate import SmoothBivariateSpline

x=x.ravel()
x=(x[x!=np.isnan])
y=y.ravel()
y=(y[y!=np.isnan])
z=z.ravel()
z=(z[z!=np.isnan])

xnew = np.arange(9,11.5, 0.01)
ynew = np.arange(10.5,15, 0.01)

f = SmoothBivariateSpline(x,y,z,kx=1,ky=1)

znew=np.transpose(f(xnew, ynew))
当kx=1和ky=1
f=SmoothBivariateSpline(x,y,z,kx=1,ky=1)

当kx=2和ky=2时,您可以得到:

当kx=3和ky=3时,得到:


我改变了3张图片的级别,这样更容易看到。但是,检查刻度,在采样区域之外,这些值可能会很快变得疯狂,因此,如果必须进行外推,请勤勉地进行外推

谢谢-比interp2d工作得更好。是否可以为输入网格之外的xnew和ynew坐标外推z值?您可以使用“fill_value”关键字将它们设置为常量,或者使用“nearest”方法创建一个相当难看的近似值。然而,我希望在每个xnew,ynew处进行平滑的外推,以便填充参数空间。2d中的外推是一个非常重要的问题,取决于您正在做什么,最好是使用NaN,以便您知道它在采样区域之外,但如果必须,可能线性外推是一个安全的赌注,但你可以很快出界。我将编辑答案,以包含一些使用
SmoothBivariateSpline
进行外推的图像。我同意,您必须小心二维外推,这是一个很好的例子。请您编辑一下,以显示您是如何输入
SmoothBivariateSpline
类的。谢谢你的帮助。当然,我是一个不同的导入,我会加上它,代码更接近你原来的是转置(!)。现在有道理了:)