Метод reduceat
Метод reduceat класса ufunc выполняет операцию
редукции (свёртки) для последовательности срезов массива.
В отличие от метода reduce, который применяет операцию
ко всему массиву целиком, reduceat позволяет указать
несколько точек начала и конца, чтобы выполнить редукцию
для каждого указанного промежутка независимо.
Первым параметром передаётся массив для обработки,
вторым - список индексов, определяющих границы срезов.
Синтаксис
ufunc.reduceat(array, indices, axis=0, dtype=None, out=None)
Параметры:
-
array- входной массив, к которому применяется редукция -
indices- массив индексов, задающих начальные и конечные точки срезов. Еслиindices[i]меньшеindices[i+1], то редукция применяется к срезу отindices[i]доindices[i+1]. Еслиindices[i] > indices[i+1], то редукция применяется отindices[i]до конца массива, а результат помещается на позициюi+1. -
axis- ось, вдоль которой выполняется редукция (по умолчанию 0) -
dtype- тип данных для промежуточных вычислений и результата -
out- массив для записи результата
Пример
Применим метод reduceat к одномерному массиву
с помощью операции сложения:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
res = np.add.reduceat(arr, [0, 3, 5])
print(res)
В этом примере индексы [0, 3, 5] определяют срезы: от 0 до 3 (сумма элементов 1+2+3=6), от 3 до 5 (сумма элементов 4+5=9), от 5 до конца (сумма элементов 6+7+8=21):
[ 6 9 21]
Пример
Рассмотрим пример с убывающими индексами.
Когда indices[i] > indices[i+1],
редукция применяется от indices[i] до конца массива:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
res = np.add.reduceat(arr, [0, 5, 3])
print(res)
Результат: редукция от 0 до 5 (1+2+3+4+5=15), от 5 до конца (6+7+8=21), затем от 3 до конца (4+5+6+7+8=30):
[15 21 30]
Пример
Применим метод reduceat для двумерного массива
по строке (ось 0) и по столбцам (ось 1):
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
res_rows = np.add.reduceat(arr, [0, 2], axis=0)
res_cols = np.add.reduceat(arr, [0, 2], axis=1)
print("По строкам:")
print(res_rows)
print("По столбцам:")
print(res_cols)
Результат выполнения кода:
"По строкам:"
[[ 1 2 3]
[11 13 15]]
"По столбцам:"
[[ 3 3]
[ 9 6]
[15 9]]
При редукции по строкам (axis=0) первый срез - строка 0, второй срез - строки 1 и 2 (4+7=11, 5+8=13, 6+9=15). При редукции по столбцам (axis=1) первый срез - столбец 0, второй срез - столбцы 1 и 2.
Пример
Используем метод reduceat с операцией умножения
для нахождения произведений в срезах:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
res = np.multiply.reduceat(arr, [0, 3])
print(res)
Результат: произведение элементов от 0 до 3 (1*2*3=6) и от 3 до конца (4*5=20):
[ 6 20]
Пример
Метод reduceat можно использовать с пользовательскими
функциями, созданными с помощью frompyfunc.
Например, найдём максимумы в срезах:
import numpy as np
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])
res = np.maximum.reduceat(arr, [0, 3, 5])
print(res)
Результат выполнения кода:
[4 5 9]
Смотрите также
-
метод
reduce,
который выполняет редукцию по всему массиву -
метод
accumulate,
который накапливает результат редукции на каждом шаге -
метод
outer,
который применяет операцию ко всем парам элементов -
метод
at,
который выполняет операцию над элементами по указанным индексам