Матрицы Numpy строго двумерны, а массивы NumPy (ndarrays) N-мерны. Матричные объекты являются подклассом ndarray, поэтому они наследуют все атрибуты и методы ndarrays.
Основное преимущество числовых матриц состоит в том, что они обеспечивают удобное обозначение для умножения матриц: если a и b являются матрицами, то a*b
это их матричное произведение.
import numpy as np
a = np.mat('4 3; 2 1')
b = np.mat('1 2; 3 4')
print(a)
# [[4 3]
# [2 1]]
print(b)
# [[1 2]
# [3 4]]
print(a*b)
# [[13 20]
# [ 5 8]]
С другой стороны, @
начиная с Python 3.5, NumPy поддерживает умножение инфиксных матриц с помощью оператора, поэтому вы можете добиться такого же удобства умножения матриц с помощью ndarrays в Python> = 3.5.
import numpy as np
a = np.array([[4, 3], [2, 1]])
b = np.array([[1, 2], [3, 4]])
print(a@b)
# [[13 20]
# [ 5 8]]
И матричные объекты, и ndarrays должны .T
возвращать транспозицию, но матричные объекты также имеют .H
для сопряженной транспозиции, и.I
для обратной.
Напротив, массивы numpy последовательно придерживаются правила, согласно которому операции применяются поэлементно (за исключением @
оператора new ). Таким образом, если a
и b
являются массивами, то a*b
массив формируется путем умножения компонентов поэлементно:
c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
Чтобы получить результат умножения матриц, вы используете np.dot
(или @
в Python> = 3.5, как показано выше):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
**
Оператор также ведет себя по- разному:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Так 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
против NumPy matrix
х годов здесь .