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.]])