我有一个巨大的(~20亿个数据点)xarray.DataArray
。我想随机删除(掩蔽或用np.nan
替换)给定百分比的数据,其中每个数据点被选择删除/掩蔽的概率在所有坐标中都是相同的。我可以将数组转换成numpy.array
,但是为了提高速度,我最好将它保存在dask块中。你知道吗
我的数据如下:
>> data
<xarray.DataArray 'stack-820860ba63bd07adc355885d96354267' (variable: 8, time: 228, latitude: 721, longitude: 1440)>
dask.array<stack, shape=(8, 228, 721, 1440), dtype=float64, chunksize=(1, 6, 721, 1440)>
Coordinates:
* latitude (latitude) float32 90.0 89.75 89.5 89.25 89.0 88.75 88.5 ...
* variable (variable) <U5 u'fal' u'swvl1' u'swvl3' u'e' u'swvl2' u'es'
* longitude (longitude) float32 0.0 0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0
* time (time) datetime64[ns] 2000-01-01 2000-02-01 2000-03-01 ...
我定义了
frac_missing = 0.2
k = int(frac_missing*data.size)
我已经试过了:
np.ndindex
一起工作,但是np.ndindex
对象被转换成一个非常慢的列表。我试着绕过转换,简单地迭代np.ndindex
对象,如here和here所述,但是迭代整个迭代器对于大约20亿个数据点来说很慢。你知道吗np.random.choice(data.stack(newdim=('latitude','variable','longitude','time')),k,replace=False)
返回所需的数据点子集,但不将其设置为nan预期的输出将是xarray.DataArray
,给定的数据点百分比设置为np.nan
或被屏蔽,最好是相同的形状和相同的dask块。你知道吗
由user545424提出的建议是一个极好的开端。为了避免出现内存问题,可以将其放入一个小型的用户定义函数中,并使用
apply_ufunc
方法将其映射到DataArray上。你知道吗有关包装自定义函数以使用xarray的更多说明,请参见here.
相关问题 更多 >
编程相关推荐