Macierze Numpy są ściśle 2-wymiarowe, natomiast numpy tablice (ndarrays) są N-wymiarowe. Obiekty macierzy są podklasą ndarray, więc dziedziczą wszystkie atrybuty i metody ndarrays.
Główną zaletą numpy matryc jest to, że zapewniają wygodną notację dla mnożenia macierzy: jeśli a i b są macierzami, to a * b jest ich macierzą produkt.
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, jak Pythona 3.5, NumPy obsługuje Infix mnożenia macierzy za pomocą operatora @
, dzięki czemu można osiągnąć taką samą wygodę mnożenia macierzy z ndarrays w Pythonie> = 3.5.
import numpy as np
a=np.array([[4, 3], [2, 1]])
b=np.array([[1, 2], [3, 4]])
print([email protected])
# [[13 20]
# [ 5 8]]
Oba obiekty matrycy i ndarrays mają .T
powrotu transpozycję, ale macierz przedmiotów także .H
przez sprzężoną transpozycję i .I
na odwrotnym.
W przeciwieństwie do tablic numpy konsekwentnie stosuje się zasadę, że operacje są stosowane elementycznie (z wyjątkiem nowego operatora @
). Tak więc, jeśli a
i b
są NumPy tablice następnie a*b
jest tablica utworzony przez mnożenie elementów element mądry:
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 można użyć np.dot
(lub @
Pythona> = 3.5, jak to przedstawiono powyżej)
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
operator **
zachowuje także w inny sposób:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Ponieważ a
jest macierzą, a**2
zwraca produkt macierzowy a*a
. Od c
jest ndarray, c**2
zwraca ndarray z każdym elementem do kwadratu elementowo.
Istnieją inne techniczne różnice między obiektami macierzowymi i ndarrays (związane z np.ravel, wyborem pozycji i zachowaniem sekwencji).
Główną zaletą tablic numpy jest to, że są one bardziej ogólne niż macierze 2-wymiarowe o rozmiarach od . Co się dzieje, gdy chcesz 3-wymiarowej tablicy? Następnie musisz użyć ndarray, a nie obiektu macierzy.W związku z tym uczenie się korzystania z obiektów macierzowych wymaga więcej pracy - musisz nauczyć się operacji na macierzy i operacji na tablicach.
Pisanie programu, który używa zarówno macierzy jak i tablic, utrudnia życie , ponieważ trzeba śledzić, jaki typ obiektu są twoje zmienne, aby mnożenie nie powróciło, czego nie oczekujesz.
W przeciwieństwie do tego, jeśli pozostaniesz tylko przy użyciu ndarrays, możesz zrobić wszystko, co można zrobić z obiektami macierzowymi, i więcej, z wyjątkiem nieco innych funkcji/notacji .
Jeśli chcesz zrezygnować z atrakcyjności notacji NumPy matrix (co można osiągnąć równie elegancko z ndarrays w Pythonie> = 3.5), to sądzę, że tablice NumPy są zdecydowanie drogą do zrobienia.
PS. Oczywiście, naprawdę nie musisz wybierać jednego kosztem drugiego, od np.asmatrix
i np.asarray
pozwala na konwersję jednego do drugiego (jako długo, jak tablica jest dwuwymiarowa).
Jest streszczenie różnic między NumPy arrays
vs NumPy matrix
ES here.
Nie mam wystarczających informacji, aby uzasadnić odpowiedź, ale z tego, co mogę powiedzieć, główna różnica polega na wdrożeniu mnożenia. Macierz wykonuje mnożenie macierzy/tensora, podczas gdy tablica dokonuje mnożenia elementarnego. –
Python 3.5 dodał operator infix @ do mnożenia macierzy (PEP 465), a NumPy 1.10 dodał obsługę. Więc jeśli używasz Pythona 3.5+ i NumPy 1.10+, możesz po prostu napisać 'A @ B' zamiast' A.dot (B) ', gdzie' A' i 'B' są 2D' ndarray's. To eliminuje główną zaletę używania 'matrix' zamiast zwykłego' ndarray's, IMHO. – MiniQuark