2017-12-16 13 views
1

私はベクトルの2つのリストを持っています。配列の2つのリストの外積を効率的に計算する方法

A = np.random.rand(100,2000) 
B = np.random.rand(100,1000) 

Iは第3など、Bの最初のエントリを持つAの最初のエントリ第2の外積を計算する必要があります。

ナイーブループ

outers = [] 
for a, b in zip(A,B): 
    outers.append(np.outer(a,b)) 

コンピューター上≈730 [ミリ秒](&&timeit経由)を取ります。

最後にoutersは、100x1000の長さの2000x1000アレイのリストですが、これは正しいです。

B[0]とTHEN A[1] B[1]を実際に最初に計算するように、このタスクを並列化する方が効率的な方法が必要です。

+0

これをチェックしましたか?[質問](https://stackoverflow.com/questions/27809511/efficient-outer-product-in-python) –

+2

'braodcasting'を使用してください:' A [:、:、None] * B [:、なし] '。 – Divakar

+0

@Divakarいずれの方法も700msより高速ではありません。 ブロードキャストは750ms、einsumは900ms – Swift

答えて

0

NumPy配列演算を並列に実行する場合は、Daskが最適です。たとえば、次のようにこの操作を行うことができます。

import dask.array as da 
dA = da.from_array(A, chunks=(10, A.shape[1])) 
dB = da.from_array(B, chunks=(10, B.shape[1])) 

task_graph = dA[:, :, None] * dB[:, None] 

result = task_graph.compute() 

compute()ステップ等の特定のために

複数のスレッド、複数のプロセス、複数のコア、複数のマシン上で計算を適用するのに十分な柔軟性があります入力配列をチャンクすることやアウトプット配列を連結するオーバーヘッドは、単純に100個の外部製品を実行するコストと比較して重要なので、シリアルアプローチよりも多くを得ることはありません。しかし、より大きな問題については、そのようなアプローチはかなりのスピードアップにつながる可能性があります。

関連する問題