Рассмотрим пример матричного массива:
[[0 1 2 1 0]
[1 1 2 1 0]
[0 1 0 0 0]
[1 2 1 0 0]
[1 2 2 3 2]]
Что мне нужно сделать:
- найти максимумы в каждом ряду
- выбрать меньшее окружение максимумов из каждой строки (в данном случае 3 значения)
- вставить окружение максимумов в новый массив (уже)
Для приведенного выше примера результат:
[[ 1. 2. 1.]
[ 1. 2. 1.]
[ 0. 1. 0.]
[ 1. 2. 1.]
[ 2. 3. 2.]]
Мой текущий рабочий код:
import numpy as np
A = np.array([
[0, 1, 2, 1, 0],
[1, 1, 2, 1, 0],
[0, 1, 0, 0, 0],
[1, 2, 1, 0, 0],
[1, 2, 2, 3, 2],
])
b = A.argmax(axis=1)
C = np.zeros((len(A), 3))
for idx, loc, row in zip(range(len(A)), b, A):
print(idx, loc, row)
C[idx] = row[loc-1:loc+2]
print(C)
Мой вопрос:
Как избавиться от цикла for и заменить его на более дешевую операцию с клочками?
Примечание:
Этот алгоритм предназначен для выпрямления ломаных "линий" в кадрах видеопотока с тысячами строк.