Python - 使用点列表从网格化 NetCDF 中提取数据,无需 for 循环
Python - Use list of points to extract data from gridded NetCDF without for loops
以下示例使用东风的"Unidata"样本netCDF数据集,可以是downloaded from here (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)
哪个 returns:
[59.29171, 17.413916, -4.4006901, -11.15424, -5.2684789, 2.1235929, -6.134573]
但是 append()
在大数据集上很笨拙,我正在尝试加快我的代码,所以我也不想使用 for 循环,而宁愿 return 单个结果线。我试过使用这条线这样做:
# extract variable
ua_array = fh.variables['ua'][0,16,lat,lon]
print(ua_array)
其中 return 点的每一个可能组合,而不仅仅是我所追求的:
[[ 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_array
是一个 NumPy 数组。因此,调用它的 ua_list
有点误导。
以下示例使用东风的"Unidata"样本netCDF数据集,可以是downloaded from here (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)
哪个 returns:
[59.29171, 17.413916, -4.4006901, -11.15424, -5.2684789, 2.1235929, -6.134573]
但是 append()
在大数据集上很笨拙,我正在尝试加快我的代码,所以我也不想使用 for 循环,而宁愿 return 单个结果线。我试过使用这条线这样做:
# extract variable
ua_array = fh.variables['ua'][0,16,lat,lon]
print(ua_array)
其中 return 点的每一个可能组合,而不仅仅是我所追求的:
[[ 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_array
是一个 NumPy 数组。因此,调用它的 ua_list
有点误导。