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
, то результатом будет массив с формой транслируемой (совместимой) по исходному массиву.
Замечание
При вычислении произведения целых чисел используется модульная арифметика, поэтому при переполнении стека ошибки не возникает. На некоторых машинах (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])