Wiem, że @
jest przeznaczony dla dekoratorów, ale po co jest @=
w Pythonie? Czy to tylko rezerwacja na jakiś przyszły pomysł?
To tylko jedno z wielu moich pytań podczas czytania tokenizer.py
.
python
python-3.x
operators
matrix-multiplication
python-3.5
Octavia Togami
źródło
źródło
:=
operatorem morsa w Pythonie 3.8 otrzymujemy tak zwany@:=
operator ciernistej róży. (Lub w Japonii jest znany jako operator Elvisa-morsa.)Odpowiedzi:
Od tej dokumentacji :
@
Operator wprowadza w Pythonie 3.5.@=
jest mnożeniem macierzy, po którym następuje przypisanie, jak można się spodziewać. Map one__matmul__
,__rmatmul__
lub__imatmul__
podobny do tego, jak+
i+=
mapowania__add__
,__radd__
lub__iadd__
.Operator i jego uzasadnienie omówiono szczegółowo w PEP 465 .
źródło
@=
i@
są nowymi operatorami wprowadzonymi w Pythonie 3.5 wykonującymi mnożenie macierzy . Mają one na celu wyjaśnienie istniejącego do tej pory pomyłki z operatorem,*
który był używany albo do mnożenia elementów albo mnożenia macierzy, w zależności od konwencji zastosowanej w tej konkretnej bibliotece / kodzie. W rezultacie w przyszłości operator*
ma być używany tylko do mnożenia elementów.Jak wyjaśniono w PEP0465 , wprowadzono dwóch operatorów:
A @ B
, używany podobnie jakA * B
A @= B
, używana podobnie jakA *= B
Mnożenie macierzy a mnożenie według elementów
Aby szybko podkreślić różnicę, dla dwóch macierzy:
Mnożenie według elementów da:
Mnożenie macierzy da:
Wykorzystanie w Numpy
Do tej pory Numpy stosował następującą konwencję:
*
uruchamiający (i operatorzy arytmetycznych w ogóle) zdefiniowano jako operacje element mądry na ndarrays i jako matrycy-zwielokrotnienia na numpy.matrix typu.metoda / funkcja
dot
została wykorzystana do mnożenia macierzy ndarraysWprowadzenie
@
operatora sprawia, że kod zawierający mnożenie macierzy jest znacznie łatwiejszy do odczytania. PEP0465 podaje nam przykład:Oczywiście ostatnia implementacja jest znacznie łatwiejsza do odczytania i zinterpretowania jako równanie.
źródło
@
został on wdrożonylist
, a tak nie jest.@
jest związane znp.matmul
, a nienp.dot
. Są podobne, ale nie takie same.@ to nowy operator mnożenia macierzy dodany w Pythonie 3.5
Źródła: https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
Przykład
źródło