Jakie są zalety i wady każdego z nich?
Z tego, co widziałem, jedno z nich może działać jako zamiennik drugiego, jeśli zajdzie taka potrzeba, więc powinienem zawracać sobie głowę używaniem obu, czy też powinienem trzymać się tylko jednego?
Czy styl programu wpłynie na mój wybór? Robię uczenie maszynowe za pomocą numpy, więc rzeczywiście jest wiele macierzy, ale także wiele wektorów (tablic).
A @ B
zamiastA.dot(B)
, gdzieA
iB
są 2Dndarray
. Usuwa to główną zaletę używaniamatrix
zamiast zwykłegondarray
s IMHO.Odpowiedzi:
Zgodnie z oficjalnymi dokumentami nie jest już zalecane używanie klasy macierzy, ponieważ zostanie ona usunięta w przyszłości.
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
Jak już inne odpowiedzi stwierdzają, że wszystkie operacje można wykonać za pomocą tablic NumPy.
źródło
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.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.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ślia
ib
są tablicami liczbowymi,a*b
to tablica tworzona jest przez pomnożenie składników pod względem elementów:Aby uzyskać wynik mnożenia macierzy, użyj
np.dot
(lub@
w Pythonie> = 3.5, jak pokazano powyżej):**
Operatora zachowuje także w inny sposób:Ponieważ
a
jest to macierz,a**2
zwraca iloczyn macierzya*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
inp.asarray
pozwala na konwersję jednego do drugiego (tak długo, jak tablica jest 2-wymiarowe).Istnieje streszczenie różnic między NumPy
arrays
a NumPymatrix
es tutaj .źródło
mat**n
macierz może być nieelegancko zastosowana do tablicy za pomocąreduce(np.dot, [arr]*n)
np.linalg.matrix_power(mat, n)
np.dot(array2, array2)
są szybsze niżmatrix1*matrix2
. Ma to sens, ponieważmatrix
jest podklasą ndarray, która zastępuje specjalne metody, takie jak__mul__
.matrix.__mul__
połączenianp.dot
. Więc tutaj jest ponowne użycie kodu. Zamiast wykonywania mniejszej liczby kontroli użyciematrix*matrix
wymaga dodatkowego wywołania funkcji. Zaletą używaniamatrix
jest czysto składniowa, a nie lepsza wydajność.Scipy.org zaleca używanie tablic:
źródło
ndarray
. Głównym argumentem przemawiającym za użyciemmatrix
byłoby, jeśli kod jest ciężki w algebrze liniowej i wyglądałby mniej czytelnie przy wszystkich wywołaniachdot
funkcji. Ale ten argument zniknie w przyszłości, teraz, gdy operator @ jest akceptowany do użycia z mnożeniem macierzy, patrz PEP 465 . Będzie to wymagało Python 3.5 i najnowszej wersji Numpy. Klasa macierzy może być przestarzała w dalekiej przyszłości, więc lepiej użyć ndarray do nowego kodu ...scipy.sparse
matrycach. Jeśli używasz zarówno gęstej, jak i rzadkiej macierzy w kodzie, o wiele łatwiej jest się jej trzymaćmatrix
.Wystarczy dodać jedną skrzynkę do listy unutbu.
Jedną z największych praktycznych różnic dla mnie numpy ndarrays w porównaniu do macierzy numpy lub języków macierzy, takich jak matlab, jest to, że wymiar nie jest zachowany w operacjach zmniejszania. Macierze są zawsze 2d, podczas gdy na przykład średnia tablicy ma jeden wymiar mniej.
Na przykład poniższe wiersze macierzy lub tablicy:
z matrycą
z tablicą
Myślę też, że mieszanie tablic i macierzy powoduje wiele „szczęśliwych” godzin debugowania. Jednak macierze scipy.sparse są zawsze macierzami pod względem operatorów, takich jak mnożenie.
źródło
Jak wspomnieli inni, być może główną zaletą
matrix
było to, że zapewnia wygodny zapis mnożenia macierzy.Jednak w Pythonie 3.5 jest w końcu przypisanego operatora infiks mnożenia macierzy :
@
.W najnowszych wersjach NumPy można go używać z
ndarray
s:Dlatego w dzisiejszych czasach, nawet w razie wątpliwości, powinieneś się trzymać
ndarray
.źródło