我有一个netCDF4.Variable
对象:
<class 'netCDF4._netCDF4.Variable'>
int16 myvar(time, latitude, longitude)
standard_name: my_var
long_name: Something
units: (0 - 1)
add_offset: 0.499999843485
scale_factor: 1.54488841466e-05
_FillValue: -32767
missing_value: -32767
unlimited dimensions: time
current shape = (13148, 1441, 2880)
filling off
此变量是一个 3D 变量,其中第一个维度是时间维度,另外两个维度是空间维度。
我想访问此变量的子集,其中包含:
- 时间范围的子集(例如从
7000
到8000
)。 - 由空间范围的扁平版本中的索引标识的点的子集 - 在上面的示例中,索引的范围在
0
和1441 * 2880
之间.
基本上,我有:
tmin = 7000
tmax = 8000
upts = [42829, 9289, 3242]
我当前的访问方式是:
z = np.zeros(len(upts), tmax - tmin)
for i in range(tmin, tmax):
z[:, i - tmin] = my_var[i, :, :].flatten()[upts]
我想知道是否有更快的方法来做到这一点?
我无法将整个数据集加载到内存中,因为它已经很大,并且可能会更大。
我也不能仅使用单个 i
,因为我想对 z
行进行操作(对应于 my_var
中的“列” >).
最佳答案
不确定这是否在内存方面有效,但是您是否会考虑首先使用 NCO 或 CDO 从 python 之外的命令行剪切文件,然后从 python 读取该文件?这取决于您是否需要重复访问文件的不同 block ,或者这是否是一次性访问。
NCO 中 hyperslab 的命令是
ncks -d dim_name,val1,val2 in.nc -O out.nc
如果 val 是整数,则使用索引完成切割,如果它是 float ,则根据维度值完成切割。您可以在参数列表上放置多个维度。 (如本答案所示:NCO cropping a netcdf file using dimension values rather than indices)
CDO 需要您似乎拥有的标准尺寸、纬度、经度和时间,因此您可以使用 切割经纬度框和一系列时间步长
cdo seltimestep,7000,8000 -sellonlatbox,lon1,lon2,lat1,lat2 in.nc out.nc
CDO 的优点是您还可以使用日期格式来缩短时间。所以你可以使用
从 7000 减少到 8000cdo seldate,yyyymmdd,yyyymmdd in.nc out.nc
我发现这非常有用。
根据我的经验,当 NCO 工作正常时,CDO 似乎会因内存需求而窒息,因此这可能会影响您的选择。无论如何,如果您需要重复挑选文件的不同部分,这个建议对您来说不是很有用,但希望对其他人可能有用。
关于python - 快速读取变量的非连续子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525724/