Матричні матриці суворо двовимірні, а нумерові масиви (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
є нумерові масиви, то 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
вибором елемента та поведінкою послідовностей).
Основна перевага нумерованих масивів полягає в тому, що вони більш загальні, ніж двовимірні матриці . Що відбувається, коли потрібно тривимірний масив? Тоді вам доведеться використовувати ndarray, а не матричний об'єкт. Таким чином, навчитися використовувати матричні об'єкти - це більше роботи - ви повинні вивчити матричні операції з об’єктами та операції ndarray.
Написання програми, що поєднує і матриці, і масиви, ускладнює ваше життя, оскільки ви повинні відслідковувати, який тип об'єкта є вашими змінними, щоб умноження не повернуло те, чого ви не очікуєте.
На противагу цьому, якщо ви дотримуєтесь лише ndarrays, ви можете робити все, що можуть робити матричні об'єкти, і багато іншого, за винятком трохи інших функцій / позначень.
Якщо ви готові відмовитися від візуальної привабливості позначення матричного продукту NumPy (яку можна досягти майже так само елегантно за допомогою ndarrays в Python> = 3.5), то я думаю, що масиви NumPy - це безумовно шлях.
PS. Звичайно, вам дійсно не потрібно вибирати одне за рахунок іншого, оскільки np.asmatrix
і np.asarray
ви дозволяєте перетворювати одне в інше (поки масив є двовимірним).
Існує короткий огляд відмінностей між NumPy arrays
проти NumPy matrix
х років тут .