2016-12-21 3 views
3

그래서이 "문제"의 배경은 큰 파이썬 프로젝트를 최적화하려고합니다. 나는 프로그램 타이밍 시작과 실행 시간의 약 50 %가이 유사한 계산에 소요되는 것으로 나타났습니다 :이 빠르게 만들 수있는 방법을 찾기 위해 노력했습니다Numpy : 효율적인 행렬 계산 A * xj 여기서 xj는 X에서 행 j입니다

import numpy as np 

# Example 
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) 
X = np.random.multivariate_normal([0,0,0,0],np.eye(4),15000) 

# Create a lambda function to use row based 
F = lambda x: np.dot(A,x) 

# Now calculating the value 
answer = np.apply_along_axis(F, 1, X) 

print answer.shape 

하지만로 계속 실행 벽. 이게 정말이 일을하는 데 최적입니까?

답변

5

XAnp.dot을 사용하면 두 번째 축을 각각 잃을 수 있습니다. np.dot에 입력하려면 X을 첫 번째 입력으로 사용하고 A을 바꿔 두 번째 입력을 두 번째 입력으로 사용합니다.

따라서, 우리는과 같이 출력을 할 것이다 -

X.dot(A.T) 

런타임 문제에 나와있는 샘플 입력을위한 테스트 -

In [192]: %timeit np.apply_along_axis(F, 1, X) 
1 loops, best of 3: 185 ms per loop 

In [193]: %timeit X.dot(A.T) 
1000 loops, best of 3: 228 µs per loop 

In [194]: np.allclose(np.apply_along_axis(F, 1, X), X.dot(A.T)) 
Out[194]: True # verified results against original code 
+1

와우! 이것은 놀라운 속도 증가입니다! 코드에서이 답변에 링크 해 드리겠습니다. thanks :) – Dammi

+0

@piRSquared 안녕하세요! 글쎄 나는 이전에 그것을 보았고 요점은 나에게 의미가 있다는 것을 알았다. 나는 이미 그것을 좋아했다. 나는 반복 된 많은 인덱스가 있다면 도움이되는'np.take'에 대해 지적하려고 생각했다. 그 점은 내가 생각하기에 연결된 Q & A 코멘트에 @hpaulj가 만든 것입니다. 따라서 Q & A와 관련하여 의견은 주제에 대한 토론을 매우 포괄적으로 만듭니다. 그 일을 연구하는 데 좋은 직장! – Divakar

+0

@Divakar 감사합니다 – piRSquared