切片不适用于 dask 分块 xarray
Slice not working on dask chunked xarray's
我有一个大的 xarray,它有时间、y 和 x 维度,并且在 dask 时间块中 = 1,x = 2000,y = 2000。它看起来像这样:
<xarray.Dataset>
Dimensions: (time: 59, x: 6951, y: 6963)
Coordinates:
* y (y) float64 5.193e+06 5.193e+06 5.193e+06 ... 5.298e+06 5.298e+06
* x (x) float64 7.475e+05 7.476e+05 7.476e+05 ... 8.518e+05 8.518e+05
* time (time) datetime64[ns] 2017-11-11T03:51:53 ... 2018-02-27T03:40:41
Data variables:
green (time, y, x) uint16 dask.array<shape=(59, 6963, 6951), chunksize=(2, 1000, 1000)>
swir_1 (time, y, x) uint16 dask.array<shape=(59, 6963, 6951), chunksize=(2, 1000, 1000)>
mask (time, y, x) int8 dask.array<shape=(59, 6963, 6951), chunksize=(2, 1000, 1000)>
Attributes:
crs: EPSG:32648
我正在尝试对这段代码进行切片,因此我可以迭代地对其一小部分执行计算并在最后创建一个新的 xarray(由于在其上执行 .compute() 的速度有问题).我一直在尝试变体:
data.sel(x=slice(0,100),y=slice(0,100))
但是这个(和类似的变体)只会产生:
<xarray.Dataset>
Dimensions: (time: 59, x: 0, y: 0)
Coordinates:
* y (y) float64
* x (x) float64
* time (time) datetime64[ns] 2017-11-11T03:51:53 ... 2018-02-27T03:40:41
Data variables:
green (time, y, x) uint16 dask.array<shape=(59, 0, 0), chunksize=(2, 0, 0)>
swir_1 (time, y, x) uint16 dask.array<shape=(59, 0, 0), chunksize=(2, 0, 0)>
mask (time, y, x) int8 dask.array<shape=(59, 0, 0), chunksize=(2, 0, 0)>
Attributes:
crs: EPSG:32648
这个问题是因为尝试对分块数组进行切片引起的吗?我也尝试将块大小排列为与切片相同,但这产生了类似的问题。理想情况下,我只想使用 xarray 的 dask 框架来并行计算数据(例如创建索引和总和),但我无法让它工作,或者至少,任何计算都需要很长时间(30 分钟以上)。
Xarray有两种选择方式,.sel()
and .isel()
。 .sel()
基于沿指定维度的刻度标签进行选择。 .isel()
根据指定维度上的整数位置进行选择。
在您的情况下,您似乎想使用 .isel()
# select a 100x100 window
data.isel(x=slice(7.475e+05, 7.700e+05), y=slice(5.190e+06, 5.195+06))
或带有对应于 x 和 y(而不是整数)的刻度标签的 .sel()
# select a window based on x/y values
data.sel(x=slice(0, 100), y=slice(0,100))
旁注:很难说,但 dask 的性能问题希望与这个问题无关。
我有一个大的 xarray,它有时间、y 和 x 维度,并且在 dask 时间块中 = 1,x = 2000,y = 2000。它看起来像这样:
<xarray.Dataset>
Dimensions: (time: 59, x: 6951, y: 6963)
Coordinates:
* y (y) float64 5.193e+06 5.193e+06 5.193e+06 ... 5.298e+06 5.298e+06
* x (x) float64 7.475e+05 7.476e+05 7.476e+05 ... 8.518e+05 8.518e+05
* time (time) datetime64[ns] 2017-11-11T03:51:53 ... 2018-02-27T03:40:41
Data variables:
green (time, y, x) uint16 dask.array<shape=(59, 6963, 6951), chunksize=(2, 1000, 1000)>
swir_1 (time, y, x) uint16 dask.array<shape=(59, 6963, 6951), chunksize=(2, 1000, 1000)>
mask (time, y, x) int8 dask.array<shape=(59, 6963, 6951), chunksize=(2, 1000, 1000)>
Attributes:
crs: EPSG:32648
我正在尝试对这段代码进行切片,因此我可以迭代地对其一小部分执行计算并在最后创建一个新的 xarray(由于在其上执行 .compute() 的速度有问题).我一直在尝试变体:
data.sel(x=slice(0,100),y=slice(0,100))
但是这个(和类似的变体)只会产生:
<xarray.Dataset>
Dimensions: (time: 59, x: 0, y: 0)
Coordinates:
* y (y) float64
* x (x) float64
* time (time) datetime64[ns] 2017-11-11T03:51:53 ... 2018-02-27T03:40:41
Data variables:
green (time, y, x) uint16 dask.array<shape=(59, 0, 0), chunksize=(2, 0, 0)>
swir_1 (time, y, x) uint16 dask.array<shape=(59, 0, 0), chunksize=(2, 0, 0)>
mask (time, y, x) int8 dask.array<shape=(59, 0, 0), chunksize=(2, 0, 0)>
Attributes:
crs: EPSG:32648
这个问题是因为尝试对分块数组进行切片引起的吗?我也尝试将块大小排列为与切片相同,但这产生了类似的问题。理想情况下,我只想使用 xarray 的 dask 框架来并行计算数据(例如创建索引和总和),但我无法让它工作,或者至少,任何计算都需要很长时间(30 分钟以上)。
Xarray有两种选择方式,.sel()
and .isel()
。 .sel()
基于沿指定维度的刻度标签进行选择。 .isel()
根据指定维度上的整数位置进行选择。
在您的情况下,您似乎想使用 .isel()
# select a 100x100 window
data.isel(x=slice(7.475e+05, 7.700e+05), y=slice(5.190e+06, 5.195+06))
或带有对应于 x 和 y(而不是整数)的刻度标签的 .sel()
# select a window based on x/y values
data.sel(x=slice(0, 100), y=slice(0,100))
旁注:很难说,但 dask 的性能问题希望与这个问题无关。