Каковы преимущества и недостатки каждого?
Из того, что я видел, либо один может работать в качестве замены другого, если это необходимо, поэтому я должен беспокоиться об использовании обоих или я должен придерживаться только одного из них?
Повлияет ли стиль программы на мой выбор? Я занимаюсь машинным обучением, используя numpy, поэтому действительно много матриц, но также много векторов (массивов).
A @ B
вместоA.dot(B)
, гдеA
иB
2Dndarray
. Это устраняет основное преимущество использованияmatrix
вместо простыхndarray
s, IMHO.Ответы:
Согласно официальным документам, больше не рекомендуется использовать матричный класс, так как он будет удален в будущем.
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
Поскольку другие ответы уже заявляют, что вы можете выполнить все операции с массивами NumPy.
источник
Матрицы Numpy строго двумерны, а массивы NumPy (ndarrays) N-мерны. Матричные объекты являются подклассом ndarray, поэтому они наследуют все атрибуты и методы ndarrays.
Основное преимущество числовых матриц состоит в том, что они обеспечивают удобное обозначение для умножения матриц: если a и b являются матрицами, то
a*b
это их матричное произведение.С другой стороны,
@
начиная с Python 3.5, NumPy поддерживает умножение инфиксных матриц с помощью оператора, поэтому вы можете добиться такого же удобства умножения матриц с помощью ndarrays в Python> = 3.5.И матричные объекты, и ndarrays должны
.T
возвращать транспозицию, но матричные объекты также имеют.H
для сопряженной транспозиции, и.I
для обратной.Напротив, массивы numpy последовательно придерживаются правила, согласно которому операции применяются поэлементно (за исключением
@
оператора new ). Таким образом, еслиa
иb
являются массивами, тоa*b
массив формируется путем умножения компонентов поэлементно:Чтобы получить результат умножения матриц, вы используете
np.dot
(или@
в Python> = 3.5, как показано выше):**
Оператор также ведет себя по- разному:Так
a
как является матрицей,a**2
возвращает матричное произведениеa*a
. Такc
как ndarray,c**2
возвращает ndarray с каждым компонентом в квадрате поэлементно.Существуют и другие технические различия между матричными объектами и ndarrays (связанные с
np.ravel
выбором элементов и поведением последовательности).Основное преимущество числовых массивов состоит в том, что они являются более общими, чем двумерные матрицы. . Что происходит, когда вы хотите 3-мерный массив? Тогда вы должны использовать ndarray, а не матричный объект. Таким образом, научиться использовать матричные объекты - это больше работы - вы должны изучить операции с матричными объектами и операции ndarray.
Написание программы, которая смешивает как матрицы, так и массивы, усложняет вашу жизнь, потому что вы должны отслеживать, какой тип объекта являются вашими переменными, чтобы умножение не возвращало то, чего вы не ожидали.
Напротив, если вы придерживаетесь только ndarrays, то можете делать все, что могут делать матричные объекты, и даже больше, за исключением слегка отличающихся функций / обозначений.
Если вы готовы отказаться от визуальной привлекательности обозначения продуктов матрицы NumPy (что может быть достигнуто почти так же элегантно с помощью ndarrays в Python> = 3.5), то я думаю, что массивы NumPy - это определенно правильный путь.
PS. Конечно, вы действительно не должны выбрать один за счет другого, так
np.asmatrix
иnp.asarray
позволяют конвертировать один к другому ( до тех пор , пока массив является 2-мерным).Существует краткий обзор различий между NumPy
arrays
против NumPymatrix
х годов здесь .источник
mat**n
матрица может быть неэлегентно применена к массиву с помощьюreduce(np.dot, [arr]*n)
np.linalg.matrix_power(mat, n)
np.dot(array2, array2)
выполняются быстрее, чемmatrix1*matrix2
. Это имеет смысл, потому чтоmatrix
это подкласс ndarray, который переопределяет специальные методы, такие как__mul__
.matrix.__mul__
звонкиnp.dot
. Так что здесь есть повторное использование кода. Вместо того, чтобы выполнять меньше проверок, использованиеmatrix*matrix
требует дополнительного вызова функции. Таким образом, преимущество использованияmatrix
чисто синтаксическое, а не лучшая производительность.Scipy.org рекомендует использовать массивы:
источник
ndarray
. Основным аргументом для использованияmatrix
было бы, если ваш код тяжел в линейной алгебре и выглядел бы менее ясно со всеми вызовамиdot
функции. Но этот аргумент исчезнет в будущем, теперь, когда @ -оператор принят для использования с умножением матриц, см. PEP 465 . Для этого потребуется Python 3.5 и последняя версия Numpy. Класс матрицы может устареть в далеком будущем, поэтому лучше использовать ndarray для нового кода ...scipy.sparse
матрицах. Если вы используете в своем коде как плотные, так и разреженные матрицы, гораздо проще придерживаться этогоmatrix
.Просто чтобы добавить один случай в список unutbu.
Одно из самых больших практических отличий для меня от numpy ndarrays по сравнению с numpy матрицами или матричными языками, такими как matlab, заключается в том, что измерение не сохраняется в операциях приведения. Матрицы всегда 2d, в то время как среднее значение массива, например, имеет на одно измерение меньше.
Например, demean строки матрицы или массива:
с матрицей
с массивом
Я также думаю, что смешивание массивов и матриц порождает много «счастливых» часов отладки. Однако матрицы scipy.sparse всегда являются матрицами в терминах таких операторов, как умножение.
источник
Как уже упоминалось, возможно, главное преимущество
matrix
заключалось в том, что он предоставлял удобную запись для умножения матриц.Однако в Python 3.5, наконец, есть специальный инфиксный оператор для умножения матриц :
@
.В последних версиях NumPy его можно использовать с
ndarray
s:Так что в настоящее время, даже больше, когда вы сомневаетесь, вы должны придерживаться
ndarray
.источник