2016-08-04 17 views
2

Ich konvertiere Matlab-Code in Python. Ich muss eine Matrixmanipulation durchführen. Meine Matrix (A) ist (gerade) eine 65x3-Matrix. Die Anzahl der Zeilen ist jedoch abhängig davon, in welchem ​​Schritt ich mich im Programm befinde.Effiziente NDarray-Operationen

In Matlab, der Code arbeite ich an ist:

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

Der folgende Python-Code gibt die erwartete Ausgabe nur in Ordnung. Ich bin nur neugierig, ob es einen besseren (mehr Pythonic, schneller, etc) Weg gibt, dies zu tun? Ich versuche nur bei Python und Numpy zu bleiben.

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

Dank an jeden, der bereit ist zu helfen.

+0

Abgesehen von der Verwendung der Abkürzung 'A.T' für die Transponierung können Sie nicht viel besser machen. (Aber das ist wirklich nur Auge Zucker, wird keinen tatsächlichen Unterschied machen) – Julien

+0

Es sieht aus wie Sie die psuedo-inverse der Matrix "A" berechnen. Wenn Ihre Anwendung nicht speziell die Pseudoinverse berechnen muss, wenn Sie die Berechnung der Umkehrung vermeiden können, tun Sie es nicht. Dieser Artikel von John D. Cook sollte einen Einblick geben: http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/. Wenn Sie versuchen, die Lösung der kleinsten Quadrate für ein überbestimmtes (oder unterbestimmtes) Gleichungssystem zu finden, verwenden Sie die ['numpy.linalg.lstsq'] (http://docs.scipy.org/doc/numpy/reference/ generierte/numpy.linalg.lstsq.html) Methode, um Ihre Lösung direkt zu berechnen. – rayryeng

Antwort

1

Sie können das Attribut T verwenden (das Array wird transponiert). Wenn Sie Python 3.5 verwenden, können Sie auch @ für das Punktprodukt verwenden (Details siehe PEP 465).

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

Danke. Das war perfekt. Ich wusste, dass es eine bessere Art geben musste, es zu schreiben. – Adam

+0

Sie sind willkommen :) – Alex

+0

Beachten Sie, dass Sie, wenn Sie 'inv' viel verwenden, können Sie tun 'von numpy.linalg import inv' am Anfang der Datei, und dann einfach tun output = inv (AT @ A) @ AT'. Beachten Sie auch, dass sich dies nicht mit der MATLAB-Version verhält, wenn Sie mit komplexen Zahlen arbeiten. In diesem Fall ist die Transponierung von MATLAB keine einfache Array-Transponierung, sondern auch die Konjugation der Elemente. – TheBlackCat