@=
і @
нові оператори, введені в Python 3.5, що виконують множення матриць . Вони призначені для уточнення плутанини, яка існувала досі, з оператором, *
який використовувався або для мультиплікаційного множення, або для матричного множення, залежно від умовності, застосованої в цій конкретній бібліотеці / коді. Як результат, в майбутньому оператор *
призначений використовуватись лише для елементарного множення.
Як пояснено в PEP0465 , було введено два оператори:
- Новий бінарний оператор
A @ B
, що використовується аналогічно якA * B
- Версія на місці
A @= B
, використовується аналогічно якA *= B
Матричне множення проти елементарного множення
Щоб швидко виділити різницю, для двох матриць:
A = [[1, 2], B = [[11, 12],
[3, 4]] [13, 14]]
Елементне множення дасть результат:
A * B = [[1 * 11, 2 * 12],
[3 * 13, 4 * 14]]
Матричне множення дасть:
A @ B = [[1 * 11 + 2 * 13, 1 * 12 + 2 * 14],
[3 * 11 + 4 * 13, 3 * 12 + 4 * 14]]
Використання в Numpy
Поки Numpy використовував таку конвенцію:
Введення @
оператора значно полегшує зчитування коду, що включає множення матриць. PEP0465 дає нам приклад:
# 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)
Зрозуміло, що останню реалізацію набагато простіше читати та інтерпретувати як рівняння.