将项目分配给Python dask数组对象

Lcg*_*cg3 5 python-2.7 dask

我创建了一个Python dask数组,并尝试按如下所示修改数组的一部分:

import numpy as np
import dask.array as da

x = np.random.random((20000, 100, 100)) # Create numpy array
dx = da.from_array(x, chunks=(x.shape[0], 10, 10)) # Create dask array from numpy array

dx[:50, :, :] = 0 # Modify a slice of the dask array
Run Code Online (Sandbox Code Playgroud)

这种修改dask数组的尝试会引发异常:

TypeError: 'Array' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以修改dask数组切片而不会引发异常?

MRo*_*lin 5

目前dask.array不支持项目分配或任何其他变异操作。

在上面的情况下,我建议用零连接

In [1]: import dask.array as da

In [2]: dx = da.random.random((20000 - 50, 100, 100), chunks=(None, 10, 10))

In [3]: z = da.zeros((50, 100, 100), chunks=(50, 10, 10))

In [4]: dx2 = da.concatenate([z, dx], axis=0)

In [5]: dx2
Out[5]: dask.array<concate..., shape=(20000, 100, 100), dtype=float64, chunksize=(50, 10, 10)>

In [6]: (dx2 == 0)[0:100, 0, 0].compute()
Out[6]: 
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

da.where(condition, iftrue, iffalse)函数在解决经常需要突变的情况下也非常有用。

  • 谢谢你,MRocklin!这很好用!现在考虑这样一种情况,您有一个值列表(例如,`index = [10, 20, 25, 50, 100, 120]`)来索引 dx 的第 0 个轴,并且与这些索引值对应的所有元素都需要被分配为 0。在这种情况下连接不起作用,据我所知,`da.where` 也不起作用。您知道这种特殊情况的解决方法吗? (5认同)