【发布时间】:2019-05-22 13:01:17
【问题描述】:
我有一个巨大的(约 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)
这是我已经尝试过的:
-
this solution 与
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块。
【问题讨论】:
-
data[np.random.rand(*data.shape) < frac_missing] = np.nan有效吗?我没有使用过 dask,但这是你在 numpy 中的做法。 -
@user545424 这是一个优雅的解决方案,但是它会创建一个与
data大小相同的numpy.array,这太慢了
标签: python numpy dask python-xarray