У меня есть логическая маска в форме (M, N)
. Каждый столбец в маске может иметь различное количество True
элементов, но гарантированно будет иметь по крайней мере два. Я хочу найти индекс строки последних двух таких элементов настолько эффективно, насколько это возможно.
Если бы я хотел только один элемент, я мог бы сделать что-то вроде (M - 1) - np.argmax(mask[::-1, :], axis=0)
. Однако это не поможет мне получить второй по порядку индекс.
Я нашел итеративное решение с использованием np.where
или np.nonzero
:
M = 4
N = 3
mask = np.array([
[False, True, True],
[True, False, True],
[True, False, True],
[False, True, False]
])
result = np.zeros((2, N), dtype=np.intp)
for col in range(N):
result[:, col] = np.flatnonzero(mask[:, col])[-2:]
Это создает ожидаемое result
:
array([[1, 0, 1],
[2, 3, 2]], dtype=int64)
Я бы хотел избежать финального l oop. Существует ли разумно векторизованная форма вышеперечисленного? Я ищу конкретно две строки, которые всегда гарантированно существуют. Общее решение для произвольного количества элементов не требуется.