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*bto 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ą .Tzwracać transpozycję, ale obiekty macierzowe mają także .Htranspozycję sprzężoną i .Iodwrotną.
Natomiast tablice numpy konsekwentnie przestrzegają zasady, że operacje są stosowane elementarnie (z wyjątkiem nowego @operatora). Tak więc, jeśli ai bsą tablicami liczbowymi, a*bto 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ż ajest to macierz, a**2zwraca iloczyn macierzy a*a. Ponieważ cjest to ndarray, c**2zwraca 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.ravelwyborem 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.asmatrixi np.asarraypozwala na konwersję jednego do drugiego (tak długo, jak tablica jest 2-wymiarowe).
Istnieje streszczenie różnic między NumPy arraysa NumPy matrixes tutaj .