numpy.dot
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.
Примеры
Умножение числа на число или числа на массив:
>>> 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]]]])