Wprowadzenie operatora `@` do mnożenia macierzy w Pythonie 3.5 i nowszych wersjach ma kilka zalet w porównaniu z użyciem funkcji `np.dot()`:
1. Czytelność i przejrzystość: Operator `@` sprawia, że kod jest bardziej czytelny i intuicyjny, ponieważ bezpośrednio reprezentuje matematyczną operację mnożenia macierzy. Może to poprawić ogólną jakość kodu i ułatwić zrozumienie go innym programistom.
2. Zgodność z notacją matematyczną: Operator `@` jest zgodny ze standardową notacją matematyczną dotyczącą mnożenia macierzy, co może pomóc wypełnić lukę pomiędzy koncepcjami matematycznymi a ich implementacją w kodzie.
3. Ograniczona szczegółowość: Użycie operatora `@` jest bardziej zwięzłe niż wywołanie funkcji `np.dot()`, co może prowadzić do bardziej zwartego i wyrazistego kodu.
4. Ulepszona obsługa błędów: Operator `@` zapewnia lepszą obsługę błędów w porównaniu do `np.dot()`. Jeśli wymiary macierzy nie są kompatybilne z mnożeniem, operator `@` zgłosi błąd wartości `ValueError`, podczas gdy `np.dot()` może po cichu dawać nieprawidłowe wyniki.
5. Potencjalna poprawa wydajności: W niektórych przypadkach operator `@` może być nieco bardziej wydajny niż `np.dot()` ze względu na sposób, w jaki jest zaimplementowany w interpreterze Pythona. Jednak różnica w wydajności jest na ogół znikoma, a wybór między nimi powinien opierać się bardziej na czytelności i spójności.
6. Znajomość użytkowników innych języków programowania: Operator `@` służący do mnożenia macierzy jest powszechną funkcją w innych językach programowania, takich jak MATLAB i R. Używanie tej samej notacji w Pythonie może ułatwić programistom przejście zna te języki.
Chociaż `np.dot()` jest nadal prawidłową i użyteczną funkcją, szczególnie w przypadku kompatybilności wstecznej lub w określonych przypadkach użycia, operator `@` zapewnia bardziej intuicyjny i zwięzły sposób wykonywania mnożenia macierzy w Pythonie 3.5 i nowszych wersjach. Wybór między nimi ostatecznie zależy od konkretnych wymagań projektu i osobistych preferencji dewelopera.
Cytaty:
[1] https://stackoverflow.com/questions/34142485/difference-between-numpy-dot-and-python-3-5-matrix-multiplication
[2] https://labex.io/tutorials/python-numpy-dot-function-86429
[3] https://madewithml.com/courses/foundations/numpy/
[4] https://www.researchgate.net/figure/The-advantages-of-matrix-multiplication-in-GPU-versus-CPU-25_fig3_320674344
[5] https://www.geeksforgeeks.org/applications-advantages-and-disadvantages-of-matrix-data-structure/
w jaki sposób operator @ obsługuje rozgłaszanie inaczej niż np.dot
Operator `@` w Pythonie 3.5+ obsługuje rozgłaszanie inaczej niż `np.dot()` w następujący sposób:
1. Rozgłaszanie: Operator `@` wykonuje rozgłaszanie inaczej niż `np.dot()`. Operator `@` postępuje zgodnie z zasadami mnożenia macierzy, gdzie traktuje każdy stos macierzy w dwóch ostatnich indeksach jako osobne macierze i odpowiednio je rozgłasza. Oznacza to, że jeśli którykolwiek z argumentów ma wartość N-D, N > 2, jest on traktowany jako stos macierzy znajdujących się w dwóch ostatnich indeksach i odpowiednio rozgłaszany[4].
2. Kształt wyjścia: Operator `@` zwraca tablicę 3D, jeśli tablice wejściowe są 3D, natomiast `np.dot()` zwraca w takich przypadkach tablicę 4D. Dzieje się tak, ponieważ operator `@` jest przeznaczony do wykonywania mnożenia macierzy, co zazwyczaj skutkuje tablicą 3D. Z drugiej strony `np.dot()` jest bardziej elastyczna i może obsługiwać różne kształty w zależności od tablic wejściowych[1].
3. Wyrównanie osi: Operator `@` wyrównuje osie tablic wejściowych inaczej niż `np.dot()`. Operator `@` wyrównuje ostatnią oś pierwszej tablicy z drugą osią drugiej tablicy, natomiast `np.dot()` wyrównuje ostatnią oś pierwszej tablicy z przedostatnią osią drugiej tablicy [4].
4. Wydajność: Operator `@` jest generalnie szybszy niż `np.dot()` przy mnożeniu macierzy ze względu na zoptymalizowaną implementację w Pythonie 3.5 lub nowszym. Jednak różnica ta jest zwykle nieistotna, chyba że pracuje się z bardzo dużymi zbiorami danych[1].
Podsumowując, operator `@` obsługuje rozgłaszanie inaczej niż `np.dot()`, przestrzegając zasad mnożenia macierzy i traktując każdy stos macierzy w dwóch ostatnich indeksach jako osobne macierze. Powoduje to różne kształty i wyrównania osi tablic wyjściowych.
Cytaty:[1] https://stackoverflow.com/questions/34142485/difference-between-numpy-dot-and-python-3-5-matrix-multiplication
[2] https://www.digitalocean.com/community/tutorials/numpy-matrix-multiplication
[3] https://labex.io/tutorials/python-numpy-dot-function-86429
[4] https://mkang32.github.io/python/2020/08/30/numpy-matmul.html
[5] https://madewithml.com/courses/foundations/numpy/