2016-03-21 2 views
3

Ich habe ein Python dask Array erstellt und ich versuche, ein Stück des Arrays wie folgt zu ändern:Artikelzuordnung zu Python dask Array-Objekte

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 

Ein solcher Versuch, die dask Array zu ändern, erhöht die Ausnahme:

TypeError: 'Array' object does not support item assignment 

gibt es eine Möglichkeit, einen dask Array-Slice zu ändern, ohne eine Ausnahme zu erhöhen?

Antwort

2

Gegenwärtig unterstützt dask.array keine Artikelzuordnung oder eine andere Mutationsoperation.

Im obigen Fall ich mit Nullen verketten empfehlen

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) 

Die da.where(condition, iftrue, iffalse) Funktion auch Fälle, in Arbeit um sehr nützlich sein kann, wo Mutation oft erwünscht ist.

+0

Danke, MRocklin! Das funktioniert großartig! Betrachten Sie nun einen Fall, in dem Sie eine Liste von Werten haben (zB 'index = [10, 20, 25, 50, 100, 120]'), um die 0. Achse von dx zu indizieren, und alle Elemente, die diesen Indexwerten entsprechen, müssen zugewiesen werden. Die Verkettung würde in diesem Fall nicht funktionieren, und soweit ich das beurteilen kann, würde 'da.where' auch nicht funktionieren. Kennen Sie einen Workaround für diesen speziellen Fall? – Lcg3