dot | NumPy
numpy.dot(a, b, out=None)
Функция dot() вычисляет скалярное произведение двух массивов.
Перед использованием данной функции необходимо учитывать следующие нюансы:
- Если a или b является числом, то
np.dot(a, b)становится эквивалентна функцииnp.multiply(a, b)или командеa*b, которые являются более предпочтительными; - Если a или b являются одномерными массивами, т.е. векторами, то выполняется внутреннее (по сути скалярное) произведение векторов и
np.dot(a, b)становится эквивалентна функцииnp.inner(a, b), но без поддержки комплексных чисел. - Если a — это N-мерный массив,
b — это одномерный массив, то сумма произведений элементов a и b вычисляется по последней оси a.
- Если a и b являются двумерными массивами, т.е. матрицами, то выполняется матричное умножение и
np.dot(a, b)становится эквивалентна функцииnp.matmul(a, b)или командеa@b, которые являются более предпочтительными; - Если a — это N-мерный массив, а b — это M-мерный массив (при условии, что M >= 2), то вычисляется сумма произведений элементов последней оси a и элементов со второй по последнюю осей b, т.е. эквивалентно команде:
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
- Параметры:
- a, b — числа, массивы NumPy или подобные массивам объекты.
- Входные данные.
- out — массив NumPy, необязательный параметр.

- Массив в который можно поместить результат функции. Данный массив должен соответствовать форме и типу данных результирующего массива функции, а так же обязательно быть C-смежным, т.е. хранить данные в строчном С стиле. Указание данного параметра, позволяет избежать лишней операции присваивания тем самым немного ускоряя работу вашего кода. Полезный параметр если вы очень часто обращаетесь к функции в цикле.
- Возвращает:
- результат — массив NumPy или число
- Скалярное произведение a и b. Если это числа или одномерные массивы, то возвращается число, в противном случае возвращается массив.
Замечание
Длина последней оси массива a, а так же длина всех осей массива b кроме первой должны совпадать, иначе возникнет исключение ValueError.
Смотрите так же:vdot, linalg.multi_dot, matmul
Примеры
Умножение числа на число или числа на массив:
>>> import numpy as np >>> >>> np.dot(2, 2) 4 >>> >>> np.dot(2, [2, 3, 4]) array([4, 6, 8]) # Лучше использовать np.multiply() или a*b
Умножение одномерных массивов (векторов):
>>> a = np.array([2, 3, 4]) >>> b = np.array([5, 6, 7]) >>> >>> np.dot(a, b) 56 >>> # Эквивалентно: ... np.inner(a, b) # предпочтительнее 56 >>> >>> # Эквивалентно: ... np.sum(a*b) 56
Умножение двумерных массивов (матриц):
>>> a = np.arange(1, 7).reshape(2, 3)
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>>
>>> b = np.
arange(1, 7).reshape(3, 2)
>>> b
array([[1, 2],
[3, 4],
[5, 6]])
>>>
>>> np.dot(a, b)
array([[22, 28],
[49, 64]])
>>>
>>> np.dot(b, a)
array([[ 9, 12, 15],
[19, 26, 33],
[29, 40, 51]])
>>>
>>> # Эквивалентно:
...np.matmul(a, b) # предпочтительнее
array([[22, 28],
[49, 64]])Умножение одномерного массива на двумерные и многомерные:
>>> a = np.array([2, 3])
>>> b = np.array([[1, 2], [3, 4]])
>>>
>>> np.dot(a, b)
array([11, 16])
>>>
>>> c = np.arange(1, 7).reshape(2, 3)
>>> c
array([[1, 2, 3],
[4, 5, 6]])
>>>
>>> np.dot(a, c)
array([14, 19, 24])
>>>
>>> np.dot(c, a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shapes (2,3) and (2,) not aligned: 3 (dim 1) != 2 (dim 0)
>>>
>>> # Длина последней оси 'c' должна совпадать с длиной 'a':
>>> c = c.
reshape(3, 2)
>>> c
array([[1, 2],
[3, 4],
[5, 6]])
>>>
>>> np.dot(c, a)
array([ 8, 18, 28])
>>> a
array([2, 3])
>>>
>>>
>>> d = np.arange(1, 13).reshape(3, 2, 2)
>>> d
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]]])
>>>
>>> np.dot(a, d)
array([[11, 16],
[31, 36],
[51, 56]])
>>> np.dot(d, a)
array([[ 8, 18],
[28, 38],
[48, 58]])
>>>
>>>
>>> d = np.arange(1, 13).reshape(2, 3, 2)
>>> d
array([[[ 1, 2],
[ 3, 4],
[ 5, 6]],
[[ 7, 8],
[ 9, 10],
[11, 12]]])
>>>
>>> np.dot(a, d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shapes (2,) and (2,3,2) not aligned: 2 (dim 0) != 3 (dim 1)
>>> np.dot(d, a)
array([[ 8, 18, 28],
[38, 48, 58]])
>>>
>>>
>>> d = np.
arange(1, 13).reshape(2, 2, 3)
>>> d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
>>>
>>> np.dot(a, d)
array([[14, 19, 24],
[44, 49, 54]])
>>> np.dot(d, a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shapes (2,2,3) and (2,) not aligned: 3 (dim 2) != 2 (dim 0)Скалярное произведение многомерных массивов:
>>> a = np.arange(3*2*4).reshape(3, 2, 4)
>>> a
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]])
>>>
>>> b = np.arange(2*4*4).reshape(2, 4, 4)
>>> b
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]]])
>>>
>>> np.
dot(a, b)
array([[[[ 56, 62, 68, 74],
[ 152, 158, 164, 170]],
[[ 152, 174, 196, 218],
[ 504, 526, 548, 570]]],
[[[ 248, 286, 324, 362],
[ 856, 894, 932, 970]],
[[ 344, 398, 452, 506],
[1208, 1262, 1316, 1370]]],
[[[ 440, 510, 580, 650],
[1560, 1630, 1700, 1770]],
[[ 536, 622, 708, 794],
[1912, 1998, 2084, 2170]]]])примеры вычисления скалярного произведения массивов
Автор В. Дронов
/
02.04.2021
/
Библиотеки Python / Статьи по теме: Numpy
Чтобы вычислить скалярное произведение массивов numpy nd, вы можете использовать функцию numpy.dot() в Python. Она принимает в качестве аргументов два массива numpy, вычисляет их скалярное произведение и возвращает результат.
Синтаксис
Синтаксис метода numpy.dot():
numpy.dot(a, b, out=None)
| Параметр | Описание |
|---|---|
| a | [обязательный] Первый аргумент для операции скалярного произведения. |
| b | [обязательный] Второй аргумент для операции скалярного произведения. |
| out | [необязательно] Этот аргумент используется для оценки производительности. Это должен быть C-смежный массив, а dtype должен быть тем dtype, который будет возвращен для точки (a, b). |
На основе размеров входного массива
В следующей таблице указывается тип выполняемой операции на основе размеров входных массивов: a и b.
| Размерности «a» и «b» | Выход |
|---|---|
| Нулевое измерение (скалярное) | Умножение двух скаляров a и b. |
| Одномерные массивы (вектор) | Внутреннее произведение векторов.![]() |
| Двумерные массивы (матрица) | Умножение матриц. |
| a: N-мерный массив, b: 1-мерный массив | Суммируйте произведение по последней оси a и b. |
| a: N-мерный массив, b: M-мерный массив (M> = 2) | Суммируйте произведение по последней оси a и предпоследней оси b. |
Пример 1: произведение скаляров с несколькими точками
В этом примере мы берем два скаляра и вычисляем их скалярное произведение с помощью функции numpy.dot(). Точечное произведение с двумя скалярами в качестве аргументов возвращает умножение двух скаляров.
import numpy as np a = 3 b = 4 output = np.dot(a,b) print(output)
Вывод:
12
Объяснение:
output = a * b
= 3 * 4
= 12Пример 2: произведение числовых точек одномерных массивов
В этом примере мы берем два numpy одномерных массива и вычисляем их скалярное произведение с помощью функции numpy.
dot(). Мы уже знаем, что если входные аргументы метода dot() одномерные, то выход будет внутренним произведением этих двух векторов (поскольку это одномерные массивы).
import numpy as np #initialize arrays A = np.array([2, 1, 5, 4]) B = np.array([3, 4, 7, 8]) #dot product output = np.dot(A, B) print(output)
Вывод:
77
Скалярное произведение:
output = [2, 1, 5, 4].[3, 4, 7, 8]
= 2*3 + 1*4 + 5*7 + 4*8
= 77Пример 3: произведение числовых точек двумерных массивов
В этом примере мы берем два двумерных массива numpy и вычисляем их скалярное произведение. Точечное произведение двух двумерных массивов возвращает матричное умножение двух входных массивов.
import numpy as np #initialize arrays A = np.array([[2, 1], [5, 4]]) B = np.array([[3, 4], [7, 8]]) #dot product output = np.dot(A, B) print(output)
Вывод:
[[13 16] [43 52]]
Скалярное произведение:
output = [[2, 1], [5, 4]].[[3, 4], [7, 8]]
= [[2*3+1*7, 2*4+1*8], [5*3+4*7, 5*4+4*8]]
= [[13, 16], [43, 52]]В этом руководстве на примерах Python мы узнали, как вычислить скалярное произведение массивов numpy с помощью примеров программ.
This div height required for enabling the sticky sidebar
numpy.dot — NumPy v1.24 Руководство
- numpy.dot( a , b , out=None )
Скалярное произведение двух массивов. В частности,
Если оба числа a и b являются одномерными массивами, то это внутреннее произведение векторов (без комплексного сопряжения).
Если оба a и b являются двумерными массивами, это матричное умножение, но используя
matmulилиa@bявляется предпочтительным.
Если либо a , либо b являются 0-D (скалярными), это эквивалентно
умножитьи использоватьnumpy.multiply(a, b)илиa * bпредпочтительно.Если a представляет собой массив N-D, а b представляет собой массив 1-D, это произведение суммы по последняя ось a и b .
Если , то — массив N-D, а b — массив M-D (где
M>=2), это сумма произведений по последней оси a и предпоследней оси б :точка (a, b) [i, j, k, m] = сумма (a [i, j,:] * b [k,:, m])
По возможности использует оптимизированную библиотеку BLAS (см.
numpy.linalg).- Параметры:
- a array_like
Первый аргумент.
- b array_like
Второй аргумент.
- out ndarray, необязательный
Выходной аргумент.
Это должно иметь точный вид, который будет возвращен
если он не использовался. В частности, он должен иметь правильный тип, должен быть
C-непрерывный, и его dtype должен быть возвращенным dtype
для точка(а,б) . Это особенность производительности. Следовательно, если эти
условия не выполняются, вместо попытки
быть гибким.
- Возвращает:
- output ndarray
Возвращает скалярное произведение a и b . Если a и b оба скаляры или оба одномерных массива, то возвращается скаляр; в противном случае возвращается массив. Если дано из , то возвращается.
- Поднимает:
- ValueError
Если последнее измерение или не совпадает с размером предпоследнее измерение б .
См. также
-
vdot Комплексно-сопряженное скалярное произведение.

-
тензордот Сумма произведений по произвольным осям.
-
einsum Соглашение Эйнштейна о суммировании.
-
matmul Оператор @ как метод без параметра.
-
linalg.multi_dot Скалярное произведение.
Примеры
>>> np.dot(3, 4) 12
Ни один из аргументов не является комплексно сопряженным:
>>> np.dot([2j, 3j], [2j, 3j]) (-13+0j)
Для двумерных массивов это матричное произведение:
>>> а = [[1, 0], [0, 1]] >>> b = [[4, 1], [2, 2]] >>> нп.точка (а, б) массив([[4, 1], [2, 2]])>>> a = np.arange(3*4*5*6).reshape((3,4,5,6)) >>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3)) >>> np.dot(a, b)[2,3,2,1,2,2] 499128 >>> сумма(а[2,3,2,:] * б[1,2,:,2]) 499128
numpy.linalg.multi_dot — Руководство NumPy v1.
24- linalg.multi_dot( массива , * , out=None )[источник]
Вычислить скалярное произведение двух или более массивов в одном вызове функции, автоматически выбирая самый быстрый порядок оценки.
multi_dotцепочкиnumpy.dotи использует оптимальные скобки матриц [1] [2]. В зависимости от формы матриц, это может значительно ускорить умножение.Если первый аргумент одномерный, он обрабатывается как вектор-строка. Если последним аргументом является 1-D, он рассматривается как вектор-столбец. Другие аргументы должны быть двумерными.
Думайте о
multi_dotкак:def multi_dot (массивы): return functools.reduce (np.dot, массивы)
- Параметры:
- массивы последовательность array_like
Если первый аргумент одномерный, он обрабатывается как вектор-строка. Если последним аргументом является 1-D, он рассматривается как вектор-столбец.
Другие аргументы должны быть двумерными.- out ndarray, необязательный
Выходной аргумент. Это должно иметь точный вид, который будет возвращен если он не использовался. В частности, он должен иметь правильный тип, должен быть C-непрерывный, и его dtype должен быть возвращенным dtype для точка(а, б) . Это особенность производительности. Следовательно, если эти условия не выполняются, вместо попытки быть гибким.
Новое в версии 1.19.0.
- Возвращает:
- вывод ndarray
Возвращает скалярное произведение предоставленных массивов.
См. также
-
numpy.dot умножение на точку с двумя аргументами.
Примечания
Стоимость матричного умножения можно рассчитать с помощью следующая функция:
по умолчанию стоимость (A, B): вернуть A.
shape[0] * A.shape[1] * B.shape[1]
Предположим, у нас есть три матрицы \(A_{10×100}, B_{100×5}, C_{5×50}\).
Стоимость двух разных скобок следующая:
стоимость((AB)C) = 10*100*5 + 10*5*50 = 5000 + 2500 = 7500 стоимость (A(BC)) = 10*100*50 + 100*5*50 = 50000 + 25000 = 75000
Ссылки
[1]
Кормен, «Введение в алгоритмы», глава 15.2, с. 370-378
[2]
https://en.wikipedia.org/wiki/Matrix_chain_multiplication
Примеры
multi_dotпозволяет писать:>>> из numpy.linalg импортировать multi_dot >>> # Подготовить некоторые данные >>> A = np.random.random((10000, 100)) >>> B = np.random.random((100, 1000)) >>> C = np.random.random((1000, 5)) >>> D = np.random.random((5, 333)) >>> # фактическое умножение точек >>> _ = multi_dot([A, B, C, D])
вместо:
>>> _ = np.dot (np.dot (np.dot (A, B), C), D) >>> # или >>> _ = A.




arange(1, 7).reshape(3, 2)
>>> b
array([[1, 2],
[3, 4],
[5, 6]])
>>>
>>> np.dot(a, b)
array([[22, 28],
[49, 64]])
>>>
>>> np.dot(b, a)
array([[ 9, 12, 15],
[19, 26, 33],
[29, 40, 51]])
>>>
>>> # Эквивалентно:
...np.matmul(a, b) # предпочтительнее
array([[22, 28],
[49, 64]])
reshape(3, 2)
>>> c
array([[1, 2],
[3, 4],
[5, 6]])
>>>
>>> np.dot(c, a)
array([ 8, 18, 28])
>>> a
array([2, 3])
>>>
>>>
>>> d = np.arange(1, 13).reshape(3, 2, 2)
>>> d
array([[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9, 10],
[11, 12]]])
>>>
>>> np.dot(a, d)
array([[11, 16],
[31, 36],
[51, 56]])
>>> np.dot(d, a)
array([[ 8, 18],
[28, 38],
[48, 58]])
>>>
>>>
>>> d = np.arange(1, 13).reshape(2, 3, 2)
>>> d
array([[[ 1, 2],
[ 3, 4],
[ 5, 6]],
[[ 7, 8],
[ 9, 10],
[11, 12]]])
>>>
>>> np.dot(a, d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shapes (2,) and (2,3,2) not aligned: 2 (dim 0) != 3 (dim 1)
>>> np.dot(d, a)
array([[ 8, 18, 28],
[38, 48, 58]])
>>>
>>>
>>> d = np.
dot(a, b)
array([[[[ 56, 62, 68, 74],
[ 152, 158, 164, 170]],
[[ 152, 174, 196, 218],
[ 504, 526, 548, 570]]],
[[[ 248, 286, 324, 362],
[ 856, 894, 932, 970]],
[[ 344, 398, 452, 506],
[1208, 1262, 1316, 1370]]],
[[[ 440, 510, 580, 650],
[1560, 1630, 1700, 1770]],
[[ 536, 622, 708, 794],
[1912, 1998, 2084, 2170]]]])
array([[3, 4], [7, 8]])
#dot product
output = np.dot(A, B)
print(output)
Это должно иметь точный вид, который будет возвращен
если он не использовался. В частности, он должен иметь правильный тип, должен быть
C-непрерывный, и его dtype должен быть возвращенным dtype
для точка(а,б) . Это особенность производительности. Следовательно, если эти
условия не выполняются, вместо попытки
быть гибким.
Другие аргументы должны быть двумерными.
shape[0] * A.shape[1] * B.shape[1]
