xr.DataArray.where在使用几个dask块时将有效点设置为nan

时间:2019-06-20 13:00:22

标签: python dask python-xarray

我试图随机删除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]]

在如何获得预期结果的同时仍能够将我的(最初大得多的)数据分成多个块的任何帮助都受到高度赞赏。

1 个答案:

答案 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