【发布时间】:2018-01-30 16:03:29
【问题描述】:
我有一个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 中的“列”)进行操作。
【问题讨论】:
-
我已经很久没用
newCDF了,但你不能用my_var[tmin:tmax, :, upts]吗?这就是我使用numpy数组和h5py的方式。 -
@hpaulj 很抱歉,我完全忘记指定
upts包含数组的扁平数组“空间”部分的索引。在此示例中,upts值的范围可以从0到1441 * 2880。 -
您是否有空间加载
my_var[tmin:tmax,:,:],然后对数组进行upts索引?与时间范围相比,upts通常很小吗?如果必须迭代,请在最小范围内进行。 -
@hpaulj 大部分时间我都没有足够的空间,但如果您知道
tmax - tmin何时很小,我会很高兴听到。upts通常比tmax - tmin大,但不会大几个数量级。即使upts接近tmax - tmin(或更小),我认为由于数据存储在netCDF(行主要)中的方式,迭代第一个维度要快得多。 -
数据是否分块?如果是这样,访问它的最佳方式将取决于分块。对于大型 netCDF 文件,分块通常是个好主意。
标签: python python-3.x numpy netcdf