Матрицы 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 всегда соблюдают правило, согласно которому операции
применяется поэлементно (кроме нового оператора @
). Таким образом, если a
и b
являются массивами numpy, то 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, выбору элементов и поведению последовательности).
Главное преимущество массивов numpy в том, что они более общие, чем
2-мерные матрицы. Что происходит, когда вы хотите 3-мерный массив? затем
Вы должны использовать ndarray, а не матричный объект. Таким образом, научиться использовать матрицу
объекты - это больше работы - вы должны изучить операции с матричными объектами и
Операции ndarray.
Написание программы, которая использует и матрицы, и массивы, делает вашу жизнь трудной
потому что вы должны отслеживать, какой тип объекта ваши переменные, чтобы
умножение возвращает то, чего вы не ожидаете.
Напротив, если вы придерживаетесь только ndarrays, то вы можете делать все
матричные объекты могут делать и многое другое, кроме как с немного отличающимися
функции / нотации.
Если вы готовы отказаться от визуальной привлекательности матричного продукта NumPy
нотации (что может быть достигнуто почти так же элегантно с ndarrays в Python> = 3.5), тогда я думаю, что массивы NumPy, безусловно, путь.
PS. Конечно, вам действительно не нужно выбирать одно за счет другого,
поскольку np.asmatrix
и np.asarray
позволяют преобразовывать одно в другое (как
пока массив является двумерным).
Существует краткий обзор различий между NumPy arrays
против NumPy matrix
es здесь .