2013-02-20 5 views
1

큰 배열을 처리해야하는 코드가 있습니다. 예를 들어, 3D 배열 A이 있고 A 요소를 사용하여 다른 3d 배열 B을 생성해야합니다. 그러나 B의 모든 요소는 서로 독립적입니다. 예 : 나는 평행 B 배열을 구성 할 수있는 경우 numpy의 병렬 배열 조작

for i in np.arange(Nx): 
    for j in np.arange(Ny): 
    for k in np.arange(Nz): 
     B[i][j][k] = A[i+1][j][k]*np.sqrt(A[i][j-1][k-1]) 

은 그래서 대단히 속도가 향상됩니다. 파이썬에서 이것을하는 가장 간단한 방법은 무엇입니까?

또한 2D 배열의 각 행을 정규화하는 것과 비슷한 행렬 연산을 사용합니다. 예

for i in np.arange(Nx): 
    f[i,:] = f[i,:]/np.linalg.norm(f[i,:]) 

또한 각 행에 대해 병렬로 실행하면 속도가 빨라집니다. 어떻게 할 수 있습니까?

+0

가능한 복제본 [Numpy/Python : For 루프가없는 배열 반복] (0120-13752) * – YXD

답변

2

Numpy's roll 기능을 살펴보아야합니다. 나는이 코드의 첫 번째 블록에 해당 생각 (당신이 가장자리에서 무슨 일을 결정해야하지만 - roll은 "순환") :

B = np.roll(A,1,axis=0) * np.sqrt(np.roll(np.roll(A,-1,axis=1),-1,axis=2)) 

두 번째 사건에 대한 또 다른 매우 끔찍한 한 줄은 다음과 같습니다

이 라인의
f /= np.sqrt(np.sum(f**2, axis=1))[...,np.newaxis] 

설명 :

우리는 먼저 각 행의 규범을 계산하는 것입니다. 그 축에서 "평평"f

f**2 

합계 1 축 따라 사각형의하자

f = np.random.rand(5,6) 

광장 각 요소.

np.sum(f**2, axis=1) 

제곱의 합의 제곱근을 취합니다.

np.sqrt(np.sum(f**2, axis=1)) 

이제 각 행의 표준을 구합니다.

효과적으로 차원 추가 정확하게 우리가 NumPy와 방송 규칙의 사용을 만들 필요가 이것에 의해 f의 각 원래 행을 분할하려면

np.sqrt(np.sum(f**2, axis=1))[...,np.newaxis] 

그리고 마침내 우리가 계산 우리의 결과를

f /= np.sqrt(np.sum(f**2, axis=1))[...,np.newaxis] 
+0

실제 코드에서 , 가장자리는 잘 처리되지만'B' 행렬의 생성은 훨씬 더 복잡해 지므로'numpy.roll' 함수는 작업을 매우 혼란스럽고 오류의 영향을 받기 쉽습니다. for-loop의 다른 반복을 실행할 수있는 간단한 방법이 있습니까? – lovespeed

+0

프로그래밍 오류 또는 가장자리 처리의 측면에서 오류가 있습니까? – YXD

+0

프로그래밍 오류. 또한 각 루프가 독립적 인 for 루프 반복을 병렬화하는 일반적인 방법을 찾고있었습니다. – lovespeed

0

가장자리를 잘 돌보는 경우 첫 번째 벡터화에 대한 표준 방법은 다음과 같습니다.

B = np.zeros(A.shape) 
B[:-1, 1:, 1:] = A[1:, 1:, 1:] * np.sqrt(A[:-1, :-1, :-1]) 

B[-1, :, :], B[:, 0, :]B[:, :, 0]을 적절한 값으로 채워야합니다.

다른 색인으로 확장하는 것은 매우 간단해야합니다.

0

numpy에서 병렬 처리를 수행하려면 mpi4py을 확인해야합니다. 파이썬에 대한 MPI 바인딩입니다. 분산 처리가 가능합니다.