numpy.prod

numpy.prod(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>)

Функция prod() вычисляет произведение элементов массива, которое так же может выполняться по указанной оси (осям).

Параметры:
a - подобный массиву объект или массив NumPy
Указанный объект или массив может состоять из любого доступного в NumPy числового типа.
axis - None, целое число или кортеж целых чисел (необязательный аргумент)
Данный параметр указывает номер оси или номера осей массива по которым выполняется произведение его элементов. По умолчанию axis = None, что соответствует перемножению всех элементов массива. Если указано отрицательное число, то номер оси отсчитывается от последней оси по направлению к первой. Если указан кортеж целых чисел, то произведение выполняется по всем указанным осям.
dtype - тип данных NumPy (необязательный аргумент)
Данный параметр указывает тип данных возвращаемого массива а так же тип накапливающего сумматора, в котором происходит умножение элементов. По умолчанию dtype = None, что соответствует типу данных входного массива.
out - массив Numpy (необязательный аргумент)
Указывает массив в который будет помещен результат работы функции. Данный массив должен иметь форму идентичную массиву с результатом работы функции. Подробнее о данном параметре смотрите на странице универсальные функции в разделе out.
keepdims - True или False (необязательный аргумент)
Если данный параметр указан как True, то результат работы функции по указанным осям будет способен к транслированию по исходному массиву, т.е. результат функции оформляется в массив с количеством осей исходного массива. Если параметр установлен в значение False, то результатом работы функции будет либо число, либо одномерный массив чисел.
initial - число (необязательный аргумент)
Определяет начальное значение в произведении элементов массива. Данный параметр является доступным в NumPy начиная с версии 1.15.0.
Возвращает:
результат - число или массив NumPy
Массив имеющий форму входного массива a у которого удалена ось указанная в параметре axis. Если параметр axis не указан, то будет возвращено число равное произведению всех элементов массива. Если параметр keepdims установлен в значение False, то результатом будет либо число, либо одномерный массив чисел. Если параметр keepdims установлен в значение True, то результатом будет массив с формой транслируемой (совместимой) по исходному массиву.
Смотрите так же: nanprod, cumprod, sum

Замечание

При вычислении произведения целых чисел используется модульная арифметика, поэтому при переполнении стека ошибки не возникает. На некоторых машинах (32-бит) могут появляться неожиданные (ошибочные) результаты:

>>> x = np.full(5, 1000000000)
>>> x
array([1000000000, 1000000000, 1000000000, 1000000000, 1000000000])
>>> np.prod(x)
0
>>>
>>> x = np.full(5, 123456789)
>>> x
array([123456789, 123456789, 123456789, 123456789, 123456789])
>>> np.prod(x)
-962395515

Если же вам все-таки необходимо выполнять умножение для больших чисел, то можно указать тип массива object:

>>> x = np.full(5, 123456789, dtype = np.object)
>>> np.prod(x)
28679718602997181072337614380936720482949
>>> 
>>> 123456789**5 == np.prod(x)
True

Результат функции для пустого массива является 1 - нейтральный по умножению элемент:

>>> np.prod([])
1.0


Примеры

>>> import numpy as np
>>> 
>>> #  Тип результата зависит от типа входного массива:
... 
>>> np.prod([1.1, 2.2, 3.3])
7.986000000000001
>>> np.prod([1 + 1j, 2 + 2j, 3 + 3j])
(-12+12j)
>>>
>>>
>>> x = np.arange(1, 10).reshape(3, 3)
>>> x
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> np.prod(x, axis = 0)    #  произведение элементов в столбцах
array([ 28,  80, 162])
>>> np.prod(x, axis = 1)    #  произведение элементов в строках
array([  6, 120, 504])
>>>
>>> #  Если входной массив является многомерным, то мы можем
... #  указать любую ось по которой выполнять умножение:
... x = np.arange(1, 9).reshape(2, 2, 2)
>>> x
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])
>>>
>>> np.prod(x)   #  умножение всех элементов массива
40320
>>> 
>>> np.prod(x, axis = 0)   #  умножение элементов вдоль первой оси
array([[ 5, 12],
       [21, 32]])
>>> np.prod(x, axis = 1)   #  умножение элементов вдоль второй оси
array([[ 3,  8],
       [35, 48]])
>>> np.prod(x, axis = 2)   #  умножение элементов вдоль третьей оси
array([[ 2, 12],
       [30, 56]])
>>> 
>>> 
>>> #  Параметр keepdims определяет сохранность
... #  количества осей исходного массива:
... x = np.arange(1, 10).reshape(3, 3)
>>> x
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> 
>>> np.prod(x)
362880
>>> np.prod(x, keepdims = True)
array([[362880]])
>>> np.prod(x, keepdims = False)
362880
>>> 
>>> np.prod(x, axis = 0)
array([ 28,  80, 162])
>>> np.prod(x, axis = 0, keepdims = True)
array([[ 28,  80, 162]])
>>> np.prod(x, axis = 0, keepdims = False)
array([ 28,  80, 162])
>>> 
>>> np.prod(x, axis = 1)
array([  6, 120, 504])
>>> np.prod(x, axis = 1, keepdims = True)
array([[  6],
       [120],
       [504]])
>>> np.prod(x, axis = 1, keepdims = False)
array([  6, 120, 504])
>>> 
>>> 
>>> #  Параметр initial определяет число на которое будет
... #  дополнительно умножаться результат произведения элементов:
... np.prod([1, 2, 3, 4])
24
>>> np.prod([1, 2, 3, 4], initial = 2)
48
>>> np.prod([1, 2, 3, 4], initial = 3)
72
>>> 
>>> 
>>> x = np.arange(1, 5).reshape(2, 2)
>>> x
array([[1, 2],
       [3, 4]])
>>> 
>>> np.prod(x, axis = 0)
array([3, 8])
>>> np.prod(x, axis = 0, initial = 10)
array([30, 80])
>>> 
>>> np.prod(x, axis = 1)
array([ 2, 12])
>>> np.prod(x, axis = 1, initial = 10)
array([ 20, 120])