我试图随机删除xr.DataArray的一部分(如所述,并借助this question中的答案),然后仅访问原始数据集data
中的值删除。
只要数据不存储在dask数组中或仅存储在一个dask数组中,此方法就可以正常工作。一旦我定义了小于数据总大小的块,原始值就会设置为nan。
data = xr.DataArray(np.arange(5*5*5.).reshape(5,5,5), dims=('time','latitude','longitude'))
data.to_netcdf('/path/to/file.nc')
#data = xr.open_dataarray('/path/to/file.nc', chunks={'time':5}) # creates expected output
data = xr.open_dataarray('/path/to/file.nc', chunks={'time':2}) # creates observed output
def set_fraction_randomly_to_nan(data, frac_missing):
np.random.seed(0)
data[np.random.rand(*data.shape) < frac_missing] = np.nan
return data
data_lost = xr.apply_ufunc(set_fraction_randomly_to_nan, data.copy(deep=True), output_core_dims=[['latitude','longitude']], dask='parallelized', input_core_dims=[['latitude','longitude']], output_dtypes=[data.dtype], kwargs={'frac_missing': 0.5})
print(data[0,-4:,-4:].values)
# >>
# [[ 6. 7. 8. 9.]
# [11. 12. 13. 14.]
# [16. 17. 18. 19.]
# [21. 22. 23. 24.]]
print(data.where(np.isnan(data_lost),0)[0,-4:,-4:].values)
最后一行的预期输出:保留np.isnan(data_lost)
为True的所有值,并将rest设置为零
[[ 6. 0. 0. 9.]
[ 0. 0. 0. 14.]
[16. 0. 0. 0.]
[ 0. 22. 0. 24.]]
观察到的最后一行的输出:将np.isnan(data_lost)
为True的所有值设置为nan ,并将rest设置为零
[[nan 0. 0. nan]
[ 0. 0. 0. nan]
[nan 0. 0. 0.]
[ 0. nan 0. nan]]
在如何获得预期结果的同时仍能够将我的(最初大得多的)数据分成多个块的任何帮助都受到高度赞赏。
答案 0 :(得分:0)
实际上没有“深度复制”快速数组的概念。 Dask假定您应用于dask数组的所有内容都是纯函数(尽管不是直接执行),因此,如果将变异函数映射到dask数组的块上,则依赖于未定义的行为。
解决方法是在应用功能(例如
)内 内进行复制def set_fraction_randomly_to_nan(data, frac_missing):
np.random.seed(0)
data = data.copy()
data[np.random.rand(*data.shape) < frac_missing] = np.nan
return data