【问题标题】:Item assignment to Python dask array objects对 Python dask 数组对象的项分配
【发布时间】:2016-03-22 07:01:21
【问题描述】:

我创建了一个 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

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

TypeError: 'Array' object does not support item assignment

有没有办法在不引发异常的情况下修改 dask 数组切片?

【问题讨论】:

    标签: python-2.7 dask


    【解决方案1】:

    目前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)
    

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

    【讨论】:

    • 谢谢你,MRocklin!这很好用!现在考虑一个情况,您有一个值列表(例如,index = [10, 20, 25, 50, 100, 120])来索引 dx 的第 0 轴,并且与这些索引值对应的所有元素都需要分配 0。在这种情况下,连接不起作用,并且据我所知,da.where 也不起作用。您知道这种特殊情况的解决方法吗?
    • 最近支持 dask 数组突变(或 __setitem__),原始代码可以正常工作。请参阅github.com/dask/dask/issues/2000 了解一些历史记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2013-12-04
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多