2014-11-25 1 views
-1

나는 다음과 같은 한 :python/numpy - 다음 예제에서 einsum을 사용하는 방법?

sum_XY C_x I_xk 싸이 I_yl P_xy는

현재 내 코드는 다음과 같습니다

# initialise dummy values 
Nk = Nl = 100 
NX = Ny = 10 
Ix = np.random.rand(Nx, Nk) 
Iy = np.random.rand(Ny, Nl) 
C = np.random.rand(Nk) 
Pin = np.ones(Nx*Ny) 

# point 1 
Fx = (Ix * C[np.newaxis, :Nk]).T # <- this part may be unavoidable due to using arbitrary precision for Ix, Iy 
Fy = (Iy * C[np.newaxis, :Nl]).T # <- this part may be unavoidable due to using arbitrary precision for Ix, Iy 
# point 2 
H = Fx[:, np.newaxis, :, np.newaxis] * Fy[np.newaxis, :, np.newaxis, :] 
H = H.reshape([Nk*Nl, Nx*Ny]) 
out = np.dot(H, Pin) 
out.shape = [Nk, Nl] 
# end 
내가 np.einsum와 위를 할 수 있다면 나는 '나는 어떻게 든 궁금

나는 H를 만들려고 할 때마다했습니다는

추가 정보가 필요하면 알려 주시기 바랍니다 ... 너무 많은 메모리를 사용하여 끝났다.

EDIT : 그것은 단지 einsum 이후 point 2에서 효과적으로 사용될 수있는 경우 일 수있다

인해 수치 정밀도에 관한 것이다. 그래서 질문은 내가 끝날 때까지 끝까지 point 1에서와 point 2에서 einsum와 코드를 대체 할 수있는 방법이된다.

답변

0

point2부터이 귀하의 계산과 일치합니다.

H2 = np.einsum('kx,ly->klxy', Fx, Fy) 
out2 = np.einsum('klxy,xy->kl', H2, np.ones((Nx,Ny))) 
print np.allclose(out, out2) 

모양 매개 변수와 일치하도록 einsum 색인을 선택하려고했습니다. 내가 치수를 섞어 놓지 않았는지 확인하기 위해

Nk, Nl = 100, 90 
Nx, Ny = 10, 9 

으로 테스트했습니다.

그리고 2 einsum 단지 지난 2 개 차원에 걸쳐 요약하기 때문에,이 point1

Fx = np.einsum('xk,k->kx', Ix, C[:Nk]) 
Fy = np.einsum('yl,l->ly', Iy, C[:Nl]) 
out5 = np.einsum('kx,ly->kl', Fx, Fy) 
print np.allclose(out, out5) 

또는

out6 = np.einsum('xk,k,yl,l->kl', Ix, C[:Nk], Iy, C[:Nl]) 
print np.allclose(out, out6) 

또는 초기 발현을 mimicing을 포함

out4 = np.einsum('kx,ly->kl', Fx, Fy) 

로 단순화 :

# sum_XY C_x I_xk C_y I_yl P_xy 
out7 = np.einsum('k,xk,l,yl,xy->kl', Cx, Ix, Cy, Iy, Pin) 

그러나, 1 또는 2 einsums로 계산을 압연 반드시 당신에게 시간과 메모리를 저장하지 않습니다. 이 전치 등을 저장하지만, 3 개 또는 4 학기로, einsum 속도가 느려와 더 많은 메모리를 사용하는 경우가 반복해야하기 때문에이 조건에 계산을 위해, einsum 종종뿐만 아니라 dot로, 그리고 더 나은 수행 (A C 코드 레벨) 이상 큰 공간.

+0

흠 ... 그래서 내가 '사용 np.einsum 결국 한 ('KX는, LY, xy-은> KL ', FX는, 년도, Pin.reshape ([Nx를, 뉴욕])'와이 상당한 금액을 절약 할 수 속도면에서 볼 때 행렬 곱셈을 할 때와 같이 고속 일 것이라고 예상 할 수 있습니까? 또는 이렇게하면 H를 생성하지 않아도됩니다. – evan54

관련 문제