Macierze numpy są ściśle dwuwymiarowe, a tablice numpy (ndarrays) są N-wymiarowe. Obiekty macierzy są podklasą ndarray, więc dziedziczą wszystkie atrybuty i metody ndarrays.
Główną zaletą macierzy numpy jest to, że zapewniają one wygodny zapis mnożenia macierzy: jeśli aib są macierzami, a*b
to ich iloczyn macierzy.
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]]
Z drugiej strony, począwszy od Pythona 3.5, NumPy obsługuje mnożenie macierzy infix za pomocą @
operatora, dzięki czemu można osiągnąć tę samą wygodę mnożenia macierzy za pomocą ndarrays w Pythonie> = 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]]
Zarówno obiekty macierzowe, jak i ndarrays muszą .T
zwracać transpozycję, ale obiekty macierzowe mają także .H
transpozycję sprzężoną i .I
odwrotną.
Natomiast tablice numpy konsekwentnie przestrzegają zasady, że operacje są stosowane elementarnie (z wyjątkiem nowego @
operatora). Tak więc, jeśli a
i b
są tablicami liczbowymi, a*b
to tablica tworzona jest przez pomnożenie składników pod względem elementów:
c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
Aby uzyskać wynik mnożenia macierzy, użyj np.dot
(lub @
w Pythonie> = 3.5, jak pokazano powyżej):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
**
Operatora zachowuje także w inny sposób:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Ponieważ a
jest to macierz, a**2
zwraca iloczyn macierzy a*a
. Ponieważ c
jest to ndarray, c**2
zwraca ndarray z każdym komponentem do kwadratu względem elementu.
Istnieją inne techniczne różnice między obiektami macierzowymi a ndarrays (związane z np.ravel
wyborem elementów i zachowaniem sekwencji).
Główną zaletą tablic numpy jest to, że są one bardziej ogólne niż matryce dwuwymiarowe . Co dzieje się, gdy potrzebujesz trójwymiarowej tablicy? Następnie musisz użyć ndarray, a nie obiektu macierzy. Zatem nauka korzystania z obiektów macierzowych wymaga więcej pracy - musisz nauczyć się operacji na obiektach macierzowych i operacji ndarray.
Napisanie programu, który miesza zarówno macierze, jak i tablice, utrudnia życie, ponieważ musisz śledzić, jakiego rodzaju obiekt są twoje zmienne, aby mnożenie nie zwróciło czegoś, czego się nie spodziewasz.
W przeciwieństwie do tego, jeśli trzymasz się wyłącznie ndarrays, możesz robić wszystko, co mogą robić obiekty macierzowe, i więcej, z wyjątkiem nieco innych funkcji / notacji.
Jeśli chcesz zrezygnować z atrakcyjności wizualnej notacji macierzowej NumPy (którą można osiągnąć niemal równie elegancko za pomocą ndarrays w Pythonie> = 3,5), to myślę, że tablice NumPy są zdecydowanie najlepszym rozwiązaniem.
PS. Oczywiście, tak naprawdę nie mają do wyboru jeden kosztem drugiego, ponieważ np.asmatrix
i np.asarray
pozwala na konwersję jednego do drugiego (tak długo, jak tablica jest 2-wymiarowe).
Istnieje streszczenie różnic między NumPy arrays
a NumPy matrix
es tutaj .