@=
und @
sind neue Operatoren, die in Python 3.5 eingeführt wurden und eine Matrixmultiplikation durchführen . Sie sollen die bisherige Verwechslung mit dem Operator verdeutlichen, der *
je nach der in dieser bestimmten Bibliothek / diesem Code verwendeten Konvention entweder für die elementweise Multiplikation oder die Matrixmultiplikation verwendet wurde. Infolgedessen soll der Operator in Zukunft *
nur noch für die elementweise Multiplikation verwendet werden.
Wie in PEP0465 erläutert , wurden zwei Operatoren eingeführt:
- Ein neuer binärer Operator
A @ B
, der ähnlich wie verwendet wirdA * B
- Eine In-Place-Version
A @= B
, die ähnlich wie verwendet wirdA *= B
Matrixmultiplikation vs. elementweise Multiplikation
Um den Unterschied für zwei Matrizen schnell hervorzuheben:
A = [[1, 2], B = [[11, 12],
[3, 4]] [13, 14]]
Die elementweise Multiplikation ergibt:
A * B = [[1 * 11, 2 * 12],
[3 * 13, 4 * 14]]
Die Matrixmultiplikation ergibt:
A @ B = [[1 * 11 + 2 * 13, 1 * 12 + 2 * 14],
[3 * 11 + 4 * 13, 3 * 12 + 4 * 14]]
Verwendung in Numpy
Bisher verwendete Numpy die folgende Konvention:
Die Einführung des @
Operators erleichtert das Lesen des Codes mit Matrixmultiplikationen erheblich. PEP0465 gibt uns ein Beispiel:
# Current implementation of matrix multiplications using dot function
S = np.dot((np.dot(H, beta) - r).T,
np.dot(inv(np.dot(np.dot(H, V), H.T)), np.dot(H, beta) - r))
# Current implementation of matrix multiplications using dot method
S = (H.dot(beta) - r).T.dot(inv(H.dot(V).dot(H.T))).dot(H.dot(beta) - r)
# Using the @ operator instead
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
Es ist klar, dass die letzte Implementierung viel einfacher zu lesen und als Gleichung zu interpretieren ist.