2017-12-16 12 views
1

두 가지 벡터 목록이 있습니다.배열의 두 목록의 외부 제품을 어떤 병렬 방식으로 효율적으로 계산하는 방법은 무엇입니까?

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

은 그때 그때 제 등을 제, (B)의 첫 번째 엔트리와의 첫 번째 항목의 외적을 계산해야한다.

본래의 루프

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

내 컴퓨터 (&&timeit 통해) ≈ 730 [MS] 걸린다.

결국 outers은 100x1000x1000 배열의 긴 목록입니다.

B[0] 및 THEN A[1] B[1]으로 실제로 계산하기 때문에 더 효율적으로이 작업을 병렬 처리해야합니다. 여기서 우리는 모두 독립적으로 병렬 처리 할 수 ​​있습니다.

+0

[Question] (https://stackoverflow.com/questions/27809511/efficient-outer-product-in-python) –

+2

'braodcasting'을 사용하십시오 :'A [:, :, 없음] * 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 개의 외부 제품을 수행하는 데 드는 비용에 비해 현저한 차이가 있기 때문에 직렬 방식을 훨씬 능가 할 수 있습니다. 그러나 더 큰 문제의 경우 이러한 접근 방식은 상당한 속도 향상을 가져올 수 있습니다.