2016-08-04 2 views
2

파이썬에서 일부 Matlab 코드를 변환 중입니다. 매트릭스 조작을해야합니다. 내 매트릭스 (A)는 (지금 당장) 65x3 매트릭스입니다. 그러나 행 수는 프로그램에서 어떤 단계에 따라 달라질 수 있습니다.효율적인 ndarray 연산

매트랩, 내가 일하고 있어요 코드는 다음과 같습니다

output = inv(A'*A) * A'; 

다음 파이썬 코드는 잘 예상 출력을 재생합니다. 이 작업을 수행하는 데 더 나은 (더 Pythonic, 더 빨리, 등) 방법이 있다면 나는 단지 궁금한가요? 나는 기본적인 파이썬과 numpy에만 충실하려고 노력하고있다.

output = np.dot(np.linalg.inv(np.dot(np.transpose(A), A)), np.transpose(A)) 

도움을 주실 분은 계십니다.

+0

변환을 위해 바로 가기 A.T를 사용하는 것 외에는 훨씬 더 잘할 수 없습니다. (그러나 이것은 실제로 눈 설탕입니다. 실제 차이를 만들지는 않을 것입니다.) – Julien

+0

매트릭스 A의 Psuedo-inverse를 계산하는 것처럼 보입니다. 귀하의 응용 프로그램이 구체적으로 의사 역행렬을 계산해야하는 경우가 아니라면 반대의 계산을 피할 수 있다면이를 수행하지 마십시오. John D. Cook의이 기사는 통찰력을 제공해야합니다 : http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/. 과도하게 결정되거나 과소 평가 된 방정식 시스템에 대한 최소 제곱 해를 찾으려는 경우 [numpy.linalg.lstsq'] (http://docs.scipy.org/doc/numpy/reference/)를 사용하십시오. generated/numpy.linalg.lstsq.html) 메소드를 사용하여 직접 솔루션을 계산하십시오. – rayryeng

답변

1

T 속성을 사용할 수 있습니다 (배열을 조 변경 함). 또한 Python 3.5를 사용하는 경우에는 내적 제품에 @을 사용할 수 있습니다 (자세한 내용은 PEP 465 참조).

output = np.linalg.inv(A.T @ A) @ A.T 
+0

감사합니다. 그것은 완벽했습니다. 나는 그것을 쓰는 더 좋은 방법이 있어야한다는 것을 알았다. – Adam

+0

당신은 환영합니다 :) – Alex

+0

'inv'를 많이 사용한다면, 파일의 시작 부분에서'numpy.linalg import inv'을 할 수 있습니다. 그리고 나서'output = inv (AT @ A) @ AT'. 또한 복소수로 작업 할 때 MATLAB 버전과 동일하게 동작하지 않습니다.이 경우 MATLAB 전치는 간단한 배열 전치가 아니며 요소의 공역을 취합니다. – TheBlackCat