numpy.dot

numpy.dot(a, b, out=None)

Функция numpy.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]]]])