代码之家  ›  专栏  ›  技术社区  ›  JackLidge

切片不在dask chunked xarray上工作

  •  0
  • JackLidge  · 技术社区  · 5 年前

    我有一个大的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分钟以上)。

    1 回复  |  直到 5 年前
        1
  •  0
  •   jhamman    5 年前

    Xarray有两种选择方法, .sel() .isel() . () 根据指定维度上的刻度线标签进行选择。 ISE() 根据指定维度上的整数位置进行选择。

    在您的情况下,看起来您要么想要使用 ISE()

    # select a 100x100 window 
    data.isel(x=slice(7.475e+05, 7.700e+05), y=slice(5.190e+06, 5.195+06))
    

    或A () 带有与x和y相对应的勾号标签(而不是整数)

    # select a window based on x/y values 
    data.sel(x=slice(0, 100), y=slice(0,100))
    

    旁注:很难说,但是DASK的性能问题希望与这个问题无关。