2016-03-26 14 views
2

私は2つのdask配列、すなわちaとbを持っています。私はダスク配列に対する配列操作

>>>z2 = da.from_array(a.dot(b),chunks=1) 
>>> z2 
dask.array<from-ar..., shape=(3, 3), dtype=int32, chunksize=(1, 1)> 

以下のようにaとbの内積を取得するが、私は

sigmoid(z2) 

を行う際に、シェルが動作を停止します。私もそれを殺すことはできません。 ...

def sigmoid(z): 
     return 1/(1+np.exp(-z)) 

答えて

2

DaskArrayを使用する場合は、通常dask.arrayで提供される関数を使用することをお勧めします。 NumPy関数を直接使用する際の問題は、データをDask Arrayからメモリにプルすることです。これは経験したシェルフリーズの原因となる可能性があります。 dask.arrayで提供されている関数は、それらを評価したいと思うまで、遅れて連鎖することによってこれを避けるように設計されています。この場合、np.expの代わりにda.expを使用する方がよいでしょう。以下に例を示します。

これがどのように行われるかを示すコードの変更版を提供しました。この例では、.compute()を呼び出しています。この結果、完全な結果がメモリに取り込まれます。データが非常に大きい場合には、これによって問題が発生する可能性もあります。したがって、計算結果を小さくしてメモリに使いやすいようにする前に、データの小さなスライスを取ることを実証しました。データが大量であり、完全な結果を保持したい場合は、代わりにディスクに格納することをお勧めします。

これが役に立ちます。

In [1]: import dask.array as da 

In [2]: def sigmoid(z): 
    ...:  return 1/(1 + da.exp(-z)) 
    ...: 

In [3]: d = da.random.uniform(-6, 6, (100, 110), chunks=(10, 11)) 

In [4]: ds = sigmoid(d) 

In [5]: ds[:5, :6].compute() 
Out[5]: 
array([[ 0.0067856 , 0.31701817, 0.43301395, 0.23188129, 0.01530903, 
     0.34420555], 
     [ 0.24473798, 0.99594466, 0.9942868 , 0.9947099 , 0.98266004, 
     0.99717379], 
     [ 0.92617922, 0.17548207, 0.98363658, 0.01764361, 0.74843615, 
     0.04628735], 
     [ 0.99155315, 0.99447542, 0.99483032, 0.00380505, 0.0435369 , 
     0.01208241], 
     [ 0.99640952, 0.99703901, 0.69332886, 0.97541982, 0.05356214, 
     0.1869447 ]]) 
1

がそれを手に入れた私が試した、それが働いた: シグモイドは、以下のように与えられます!

ans = z2.map_blocks(sigmoid)