Предположим, что у нас есть двумерный массив arr
, набор позиций, заданных rows
и cols
, и окно формы (5, 1)
. Для (i, j)
нам нужен индекс максимального значения в пределах arr[i-2:i+2, j]
. Мы хотим повторить для всех входных (i, j)
пар.
import numpy as np
def get_max_index(arr, i, j, stride):
nr, nc = arr.shape
i_low = max(0, i - stride)
i_up = min(i + stride, nr)
idx = np.argmax(arr[i_low:i_up, j])
# transform back to original index.
return i_low + idx, j
# Given numpy array
arr = np.array([
[1,2,3,6,7],
[4,5,6,15,8],
[7,8,9,24,9],
[1,1,1,3,10],
[2,2,2,6,11],
[3,3,3,9,12],
[4,4,4,4,42]
])
# Rows and columns at which the windows will be centered.
rows = np.array([2, 4, 6, 6])
cols = np.array([1, 1, 3, 4])
# Measure corresponding to window of size 5
stride = 2
# Apply the function on the input rows and cols.
res = [get_max_index(arr, i, j, stride) for i, j in zip(rows, cols)]
assert res == [(2, 1), (2, 1), (5, 3), (6, 4)]
Мне было интересно, есть ли более быстрый numpy
способ сделать это вместо использования списка.
У него есть некоторыепохоже на « морфологическое расширение », но здесь оно находится на подмножестве ячеек массива, и нам нужны индексы.