在 python 中针对 2D 数组插入 3D WRF 数据
Interpolating 3D WRF Data against a 2D array in python
我一直在编写用于我的 WRF 模型研究的 python 脚本,但我在插值例程方面遇到了一些困难。在我的例子中,我试图绘制一个特定的字段,但是,在处理山区时,尤其是对于较低级别(1000、850),使用全面的压力级别通常会导致极端最大值或 nan 值它们在地面以下。
所以,我的想法是编写一个脚本来检测地面的压力水平(使用以下内容很容易完成):
pb = ncFile.variables['PB'][0][0]
p = ncFile.variables['P'][0][0]
sfcPres = pb + p
这导致包含地面压力的 2D 阵列表面,然后在这些上方分别建立另外两个包含压力 50hPa 和 100hPa 的场:
medLevel = sfcPres - 50
topLevel = sfcPres - 100
从这里我想将三个数组:sfcPres、medLevel 和 topLevel 提供给插值函数作为高度参数,以将每个 lat、lon 对的数据集插值到相应的 lat、lon 对三个数组。
我的问题是到目前为止我使用的所有插值例程只允许插值到压力水平的奇异值,正如我上面所说的那样会导致边缘极值问题。
我希望能够按照 this function 的顺序做一些事情,其中 desiredlevel 参数可以采用该 2D 数组并对 3D 数据集执行插值(数组 [Z, lat, lon ]) 在该二维数组中的每个点。
有谁知道一种不涉及使用循环的简单方法,因为数据集相当大,我需要使用 8 个组合集计算大约 60 个文件的函数的平均值。
谢谢!
没有简单的方法可以做到这一点,它涉及使用循环。我有自己的 WRF 例程,可以将 4D 变量场线性插值到我指定的恒定高度表面。我相信您应该能够为压力面修改此功能。我一直在工作,尽管 WRF 数据给自己带来了麻烦。
def linear_height(var,surface): #defaults to .5km to 20.5km with .5 km intervals
'''
Requirements:
import numpy as np
This function will take in a variable and the corrosponding height surface of the model to
then interpolate to constant height surfaces from 500m to 20km at 500m intervals.
The interpolation to the new height surfaces is linear and occurs from the lowest level x,y point
to the top level x,y point.
The output variable will have the same units as the input variable but will have a different shape
Assuming that height is the second column of the array, this will be the only length to change
example: linear_height(Temperature, Height_surfaces)
'''
######################################
#Edit to change the levels of the interpolated height coordinates
new_height = np.arange(500,20500,500) # 1km to 20 km
######################################
new_surf = np.empty((var.shape[0],new_height.shape[0],var.shape[2],var.shape[3]))
for TIM in np.arange(var.shape[0]):
for IDX, VAL in np.ndenumerate(var[0][0]):
new_val = np.interp(new_height,surface[TIM,:,IDX[0],IDX[1]],var[TIM,:,IDX[0],IDX[1]],left=np.nan, right=np.nan)
new_surf[TIM,:,IDX[0],IDX[1]]=new_val[:]
return new_surf
我一直在编写用于我的 WRF 模型研究的 python 脚本,但我在插值例程方面遇到了一些困难。在我的例子中,我试图绘制一个特定的字段,但是,在处理山区时,尤其是对于较低级别(1000、850),使用全面的压力级别通常会导致极端最大值或 nan 值它们在地面以下。
所以,我的想法是编写一个脚本来检测地面的压力水平(使用以下内容很容易完成):
pb = ncFile.variables['PB'][0][0]
p = ncFile.variables['P'][0][0]
sfcPres = pb + p
这导致包含地面压力的 2D 阵列表面,然后在这些上方分别建立另外两个包含压力 50hPa 和 100hPa 的场:
medLevel = sfcPres - 50
topLevel = sfcPres - 100
从这里我想将三个数组:sfcPres、medLevel 和 topLevel 提供给插值函数作为高度参数,以将每个 lat、lon 对的数据集插值到相应的 lat、lon 对三个数组。
我的问题是到目前为止我使用的所有插值例程只允许插值到压力水平的奇异值,正如我上面所说的那样会导致边缘极值问题。
我希望能够按照 this function 的顺序做一些事情,其中 desiredlevel 参数可以采用该 2D 数组并对 3D 数据集执行插值(数组 [Z, lat, lon ]) 在该二维数组中的每个点。
有谁知道一种不涉及使用循环的简单方法,因为数据集相当大,我需要使用 8 个组合集计算大约 60 个文件的函数的平均值。
谢谢!
没有简单的方法可以做到这一点,它涉及使用循环。我有自己的 WRF 例程,可以将 4D 变量场线性插值到我指定的恒定高度表面。我相信您应该能够为压力面修改此功能。我一直在工作,尽管 WRF 数据给自己带来了麻烦。
def linear_height(var,surface): #defaults to .5km to 20.5km with .5 km intervals
'''
Requirements:
import numpy as np
This function will take in a variable and the corrosponding height surface of the model to
then interpolate to constant height surfaces from 500m to 20km at 500m intervals.
The interpolation to the new height surfaces is linear and occurs from the lowest level x,y point
to the top level x,y point.
The output variable will have the same units as the input variable but will have a different shape
Assuming that height is the second column of the array, this will be the only length to change
example: linear_height(Temperature, Height_surfaces)
'''
######################################
#Edit to change the levels of the interpolated height coordinates
new_height = np.arange(500,20500,500) # 1km to 20 km
######################################
new_surf = np.empty((var.shape[0],new_height.shape[0],var.shape[2],var.shape[3]))
for TIM in np.arange(var.shape[0]):
for IDX, VAL in np.ndenumerate(var[0][0]):
new_val = np.interp(new_height,surface[TIM,:,IDX[0],IDX[1]],var[TIM,:,IDX[0],IDX[1]],left=np.nan, right=np.nan)
new_surf[TIM,:,IDX[0],IDX[1]]=new_val[:]
return new_surf