numpy.ufunc.reduceat#

метод

универсальная функция.reduceat(массив, индексы, ось=0, dtype=None, выход=None)#

Выполняет (локальное) сокращение с указанными срезами по одной оси.

Для i в range(len(indices)), reduceat вычисляет ufunc.reduce(array[indices[i]:indices[i+1]]), который становится i-й обобщённой "строкой", параллельной ось в конечном результате (т.е., в двумерном массиве, например, если axis = 0, он становится i-й строкой, но если axis = 1, он становится i-м столбцом). Есть три исключения из этого:

  • когда i = len(indices) - 1 (так для последнего индекса), indices[i+1] = array.shape[axis].

  • if indices[i] >= indices[i + 1], i-я обобщённая "строка" — это просто array[indices[i]].

  • if indices[i] >= len(array) или indices[i] < 0, возникает ошибка.

Форма выходных данных зависит от размера indices, и может быть больше, чем array (это происходит, если len(indices) > array.shape[axis]).

Параметры:
массивarray_like

Массив, над которым выполняется действие.

индексыarray_like

Парные индексы, разделенные запятыми (не двоеточием), указывающие срезы для сокращения.

осьint, необязательный

Ось, вдоль которой применяется reduceat.

dtypeкод типа данных, опционально

Тип данных, используемый для выполнения операции. По умолчанию соответствует типу out если задано, и тип данных array в противном случае (хотя может быть повышено для сохранения точности в некоторых случаях, таких как numpy.add.reduce для целочисленного или булевого ввода).

выходndarray, None или кортеж из ndarray и None, опционально

Место, в которое сохраняется результат. Если не указано или None, возвращается вновь выделенный массив. Для согласованности с ufunc.__call__, если передано как ключевой аргумент, может быть Ellipses (out=..., что имеет тот же эффект, как None, поскольку массив всегда возвращается), или кортеж из одного элемента.

Возвращает:
rndarray

Уменьшенные значения. Если выход был предоставлен, r является ссылкой на выход.

Примечания

Наглядный пример:

Если array является одномерным, функция ufunc.accumulate(array) то же самое, что ufunc.reduceat(array, indices)[::2] где indices является range(len(array) - 1) с нулем, помещенным в каждый второй элемент: indices = zeros(2 * len(array) - 1), indices[1::2] = range(1, len(array)).

Не дайте себя обмануть названием этого атрибута: reduceat(array) не обязательно меньше, чем array.

Примеры

Чтобы взять текущую сумму четырёх последовательных значений:

>>> import numpy as np
>>> np.add.reduceat(np.arange(8),[0,4, 1,5, 2,6, 3,7])[::2]
array([ 6, 10, 14, 18])

Пример в 2-D:

>>> x = np.linspace(0, 15, 16).reshape(4,4)
>>> x
array([[ 0.,   1.,   2.,   3.],
       [ 4.,   5.,   6.,   7.],
       [ 8.,   9.,  10.,  11.],
       [12.,  13.,  14.,  15.]])
# reduce such that the result has the following five rows:
# [row1 + row2 + row3]
# [row4]
# [row2]
# [row3]
# [row1 + row2 + row3 + row4]
>>> np.add.reduceat(x, [0, 3, 1, 2, 0])
array([[12.,  15.,  18.,  21.],
       [12.,  13.,  14.,  15.],
       [ 4.,   5.,   6.,   7.],
       [ 8.,   9.,  10.,  11.],
       [24.,  28.,  32.,  36.]])
# reduce such that result has the following two columns:
# [col1 * col2 * col3, col4]
>>> np.multiply.reduceat(x, [0, 3], 1)
array([[   0.,     3.],
       [ 120.,     7.],
       [ 720.,    11.],
       [2184.,    15.]])