Python-使用点列表从网格化NetCDF中提取数据,而不使用for循环

Python-使用点列表从网格化NetCDF中提取数据,而不使用for循环,python,netcdf,netcdf4,Python,Netcdf,Netcdf4,以下示例使用“Unidata”样本netCDF东风数据集,该数据集可以是(2.8 MB) 我有两个整数列表,它们对应于netCDF文件中网格数组的x和y索引。我想提取数据并将其保存到每个点组合(例如点:[(x[0],y[0]),(x[1],y[1]),(x[2],y[2]),…,(x[n],y[n])的一维数组或列表中。) 我可以用这种方法很容易地做到这一点 from netCDF4 import Dataset # grid point lists lat = [20, 45, 56, 67

以下示例使用“Unidata”样本netCDF东风数据集,该数据集可以是(2.8 MB)

我有两个整数列表,它们对应于netCDF文件中网格数组的
x
y
索引。我想提取数据并将其保存到每个点组合(例如点:
[(x[0],y[0]),(x[1],y[1]),(x[2],y[2]),…,(x[n],y[n])的一维数组或列表中。

我可以用这种方法很容易地做到这一点

from netCDF4 import Dataset

# grid point lists
lat = [20, 45, 56, 67, 88, 98, 115]
lon = [32, 38, 48, 58, 87, 92, 143]

# open netCDF file
nc_file = "./sresa1b_ncar_ccsm3-example.nc"
fh = Dataset(nc_file, mode='r')

# extract variable
point_list = zip(lat,lon)
ua_list = []
for i, j in point_list:
    ua_list.append(fh.variables['ua'][0,16,i,j])

print(ua_list)
返回:

[59.29171,17.413916,-4.4006901,-11.15424,-5.2684789,2.1235929,-6.134573]

然而,
append()
在大数据集上很笨重,我正试图加快我的代码速度,所以我也不想使用for循环,而是宁愿在一行中返回结果。我试着用这句话:

# extract variable
ua_array = fh.variables['ua'][0,16,lat,lon]
print(ua_array)
它返回每一个可能的点的组合,而不仅仅是我想要的点:

[[ 59.2917099   60.3418541   61.81352234  62.66215515  60.6419754 60.00745392  52.48550797]
[ 18.80122566  17.41391563  14.83201313  12.67425823  13.99616718 14.4371767   14.12419605]
[ -5.56457043  -5.20643377  -4.40069008  -3.25902319  -2.36573601 -2.25667071  -1.0884304 ]
[-11.66207981 -11.46785831 -11.35252953 -11.15423965 -11.35271263 -11.55139542 -11.68573093]
[ -1.15064895  -1.52471519  -2.12152767  -2.67548943  -5.26847887 -5.79328251  -6.16713762]
[ -1.95770085  -0.56232995   0.82722098   1.39629912   2.65125418 2.12359285  -6.47501516]
[ -9.76508904 -10.13490105 -10.76805496 -11.31607246 -11.93865585 -11.56440639  -6.13457298]]

如何对netCDF文件进行切片,以便在一行中获得与上述代码相同的结果?提前谢谢

首先使用
0
16
进行常规索引,然后使用
lat
lon
进行高级索引:

ua_array = fh.variables['ua'][0,16][lat,lon]
print(ua_array)
输出:

[ 59.2917099   17.41391563  -4.40069008 -11.15423965  -5.26847887
   2.12359285  -6.13457298]

顺便说一句,
ua_数组
是一个NumPy数组。因此,调用其
ua\U列表
有点误导。

非常感谢@Mike。是的,你说得对,我应该把它们称为数组。我将编辑这个问题以备将来参考。干杯