Введение оператора `@` для умножения матриц в Python 3.5+ имеет несколько преимуществ по сравнению с использованием функции `np.dot()`:
1. Читаемость и ясность. Оператор `@` делает код более читабельным и интуитивно понятным, поскольку он непосредственно представляет математическую операцию умножения матриц. Это может улучшить общее качество кода и облегчить его понимание другими разработчиками.
2. Соответствие математической записи. Оператор `@` соответствует стандартной математической записи умножения матриц, что может помочь устранить разрыв между математическими концепциями и их реализацией в коде.
3. Пониженная многословность. Использование оператора `@` более лаконично, чем вызов функции `np.dot()`, что может привести к созданию более компактного и выразительного кода.
4. Улучшенная обработка ошибок: оператор `@` обеспечивает лучшую обработку ошибок по сравнению с `np.dot()`. Если размеры матрицы несовместимы для умножения, оператор @ выдаст ошибку ValueError, тогда как np.dot() может незаметно выдать неправильные результаты.
5. Потенциальное улучшение производительности. В некоторых случаях оператор `@` может быть немного более эффективным, чем `np.dot()` из-за того, как он реализован в интерпретаторе Python. Однако разница в производительности, как правило, незначительна, и выбор между ними должен основываться больше на читабельности и последовательности.
6. Знакомство пользователей других языков программирования: оператор `@` для умножения матриц является общей функцией в других языках программирования, таких как MATLAB и R. Использование тех же обозначений в Python может облегчить переход для разработчиков. знакомы с этими языками.
Хотя `np.dot()` по-прежнему является допустимой и полезной функцией, особенно для обратной совместимости или конкретных случаев использования, оператор `@` обеспечивает более интуитивный и краткий способ выполнения матричного умножения в Python 3.5 и более поздних версиях. Выбор между ними в конечном итоге зависит от конкретных требований проекта и личных предпочтений разработчика.
Цитаты:
[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/
чем оператор @ обрабатывает широковещательную рассылку иначе, чем np.dot
Оператор `@` в Python 3.5+ обрабатывает широковещательную рассылку иначе, чем `np.dot()`, следующим образом:
1. Рассылка: оператор `@` выполняет широковещательную рассылку иначе, чем `np.dot()`. Оператор `@` следует правилам умножения матриц, согласно которым он обрабатывает каждый стек матриц в двух последних индексах как отдельные матрицы и передает их соответствующим образом. Это означает, что если любой из аргументов имеет значение N-D, N > 2, он рассматривается как стек матриц, находящихся в двух последних индексах, и транслируется соответственно[4].
2. Форма вывода: оператор `@` возвращает 3D-массив, если входные массивы являются 3D, тогда как `np.dot()` в таких случаях возвращает 4D-массив. Это связано с тем, что оператор `@` предназначен для выполнения умножения матриц, что обычно приводит к получению трехмерного массива. С другой стороны, `np.dot()` более гибок и может обрабатывать разные формы в зависимости от входных массивов[1].
3. Выравнивание по осям: оператор `@` выравнивает оси входных массивов иначе, чем `np.dot()`. Оператор @ выравнивает последнюю ось первого массива со второй осью второго массива, тогда как np.dot() выравнивает последнюю ось первого массива с предпоследней осью второго массива. [4].
4. Производительность: оператор `@` обычно работает быстрее, чем `np.dot()` для умножения матриц благодаря оптимизированной реализации в Python 3.5+. Однако эта разница обычно незначительна, если не работать с очень большими наборами данных[1].
Вкратце, оператор `@` обрабатывает широковещательную рассылку иначе, чем `np.dot()`, следуя правилам умножения матриц и обрабатывая каждый стек матриц в двух последних индексах как отдельные матрицы. Это приводит к различным формам и выравниванию осей выходных массивов.
Цитаты:[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/