Документы numpy рекомендуют использовать массив вместо матрицы для работы с матрицами. Однако, в отличие от октавы (которую я использовал до недавнего времени), * не выполняет умножение матриц, вам нужно использовать функцию matrixmultipy (). Я чувствую, что это делает код очень нечитаемым.
Кто-нибудь разделяет мои взгляды и нашел ли решение?
.*
синтаксиса vs '*' для поэлементного умножения матриц. Если бы это было так, все было бы проще, хотя я удивлен, что они выбрали*
поэлементное умножение, а не матричное умножение.Ответы:
Основная причина избегать использования
matrix
класса, заключается в том, что а) он по своей природе двумерен, и б) есть дополнительные накладные расходы по сравнению с «нормальным» массивом numpy. Если все, что вы делаете, - это линейная алгебра, то во что бы то ни стало, не стесняйтесь использовать матричный класс ... Лично я нахожу это больше проблем, чем оно того стоит.Для массивов (до Python 3.5) используйте
dot
вместоmatrixmultiply
.Например
Или в более новых версиях numpy просто используйте
x.dot(y)
Лично мне он кажется более читаемым, чем
*
оператор умножения матриц ...Для массивов в Python 3.5 используйте
x @ y
.источник
x.T.dot(A.T).dot(A).dot(x)
разве не то чтобы нечитабельно, имо Но каждому свое. Если вы в первую очередь выполняете матричное умножение, то обязательно используйтеnumpy.matrix
!numpy.matrixmultiply
его сложно набрать.numpy.dot
эквивалентно умножению матриц. Если вам действительно не нравятся обозначения, используйтеmatrix
класс.Ключевые вещи, которые нужно знать для операций с массивами NumPy по сравнению с операциями с матрицами NumPy :
Матрица NumPy является подклассом массива NumPy
Операции с массивом NumPy являются поэлементными (с учетом широковещания)
Матричные операции NumPy следуют обычным правилам линейной алгебры.
несколько фрагментов кода для иллюстрации:
но эта операция не выполняется, если эти две матрицы NumPy преобразованы в массивы:
хотя использование синтаксиса NP.dot работает с массивами ; эта операция работает как матричное умножение:
так вам когда-нибудь понадобится матрица NumPy? т.е. будет ли массив NumPy достаточным для вычисления линейной алгебры (при условии, что вы знаете правильный синтаксис, например NP.dot)?
кажется, правило состоит в том, что если аргументы (массивы) имеют формы (mxn), совместимые с данной операцией линейной алгебры, тогда все в порядке, в противном случае NumPy выбрасывает.
единственное исключение, с которым я столкнулся (вероятно, есть и другие), - это вычисление обратной матрицы .
ниже приведены фрагменты, в которых я назвал операцию чистой линейной алгебры (фактически, из модуля линейной алгебры Numpy) и передал ее в массиве NumPy.
определитель массива:
собственные векторы / пары собственных значений :
матричная норма :
qr факторизация :
ранг матрицы :
условие матрицы :
для инверсии требуется матрица NumPy:
но псевдообратная модель Мура-Пенроуза работает отлично
источник
В версии 3.5 Python наконец получил оператор умножения матриц . Синтаксис есть
a @ b
.источник
Существует ситуация, когда оператор точки даст разные ответы при работе с массивами, как и при работе с матрицами. Например, предположим следующее:
Преобразуем их в матрицы:
Теперь мы можем увидеть разные результаты для двух случаев:
источник
Ссылка с http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html
... использование класса numpy.matrix не рекомендуется , поскольку он не добавляет ничего, что не может быть выполнено с помощью 2D- объектов numpy.ndarray , и может привести к путанице в отношении того, какой класс используется. Например,
Операции scipy.linalg можно одинаково применять к numpy.matrix или к 2D- объектам numpy.ndarray .
источник
Этот трюк может быть тем, что вы ищете. Это своего рода простая перегрузка оператора.
Затем вы можете использовать что-то вроде предложенного класса Infix, например:
источник
Уместная цитата из PEP 465 - специальный инфиксный оператор для умножения матриц , как упоминалось @ petr-viktorin, проясняет проблему, к которой имел отношение OP:
Введение
@
инфиксного оператора должно помочь унифицировать и упростить матричный код Python.источник
Функция matmul (начиная с numpy 1.10.1) отлично работает для обоих типов и возвращает результат в виде класса матрицы numpy:
Вывод:
Начиная с python 3.5, как упоминалось ранее, вы также можете использовать новый оператор умножения матриц,
@
напримери получите тот же результат, что и выше.
источник