gpt4 book ai didi

python - 忽略 nan 值的二维插值

转载 作者:行者123 更新时间:2023-11-28 16:28:37 25 4
gpt4 key购买 nike

如何告诉 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]])

enter image description here

我已经能够使用蒙版阵列生成上述颜色网格,但是当我尝试使用 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()

contour with nan set to zero

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

最佳答案

我不知道为什么 interp2d 有不规则间隔数据的问题,我会推荐使用 griddata,你可以用 ravel 将你的输入数据扁平化为一个向量,然后消除 NaN,并使用它作为网格数据的输入,你会得到这样的东西

enter image description here

代码和你的没有太大区别

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) 你得到

enter image description here

对于 kx=2 和 ky=2 你会得到:

enter image description here

如果 kx=3 和 ky=3,你会得到:

enter image description here

我更改了 3 张图片的级别,以便更容易看到。但是检查比例尺,在您的采样区域之外的值可能会非常快地变得疯狂,所以如果您必须推断,请勤奋地去做

关于python - 忽略 nan 值的二维插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34408293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com