2016-08-04 3 views
2

Я конвертирую некоторый код Matlab в Python. Мне нужно сделать некоторые манипуляции с матрицами. Моя матрица (A) есть (прямо сейчас) матрица 65x3. Однако количество строк зависит от того, на каком этапе я участвую в программе.Эффективные операции ndarray

В Matlab, код, я работаю на это:

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

Следующий код Python воспроизводит ожидаемый выход только штрафом. Мне просто интересно, есть ли способ сделать это лучше (более Pythonic, быстрее и т. Д.)? Я пытаюсь придерживаться только базового Python и numpy.

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

Спасибо всем, кто готов помочь.

+0

кроме использования ярлыка 'A.T' для транспонирования, вы не можете сделать намного лучше. (но это действительно просто глазной сахара, не будет иметь никакого реального разницы) – Julien

+0

Похоже, вы вычисляете psuedo-обратную матрицу 'A'. Если вашему приложению не нужно специально вычислять psuedo-inverse, если вы не можете вычислить инверсию, тогда не делайте этого. Эта статья Джона Д. Кука должна дать представление: http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/. Если вы пытаетесь найти решение наименьших квадратов для переопределенной (или недоопределенной) системы уравнений, используйте ['numpy.linalg.lstsq'] (http://docs.scipy.org/doc/numpy/reference/ сгенерированный/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' много, вы можете сделать' from numpy.linalg import inv' в начале вашего файла, а затем просто сделать 'output = inv (AT @ A) @ AT'. Также обратите внимание, что это не будет вести себя так же, как версия MATLAB при работе со сложными числами, в этом случае транспонирование MATLAB не является простым транспонированием массива, он также принимает сопряжение элементов. – TheBlackCat

Смежные вопросы