Numpy: Есть ли способ использовать np.argmax для поиска последовательных значений? - PullRequest
1 голос
/ 17 июня 2019

Есть ли способ поиска в массиве Numpy последовательных значений и возврата их индекса?

Например, если мы используем argmax для массива, чтобы найти первый экземпляр одного элемента:

import numpy as np

a = np.array((0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1))
print(np.argmax(a == 1))

Получаем результат:

3

Есть ли способ поиска в этом же массиве первого экземпляра пары?Например, я хочу получить значение 6 для следующего кода:

import numpy as np

a = np.array((0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1))
print(np.argmax(a == [1, 1]))

Но вместо этого оно возвращает:

0

1 Ответ

1 голос
/ 17 июня 2019

Для небольшого количества последовательных шаблонов поиска мы можем просто нарезать и искать все совпадения и, наконец, использовать our-favourite argmax.

Следовательно, для 2 последовательного поискашаблон, это будет -

In [6]: ((a[:-1]==1) & (a[1:]==1)).argmax()
Out[6]: 6

Некоторое объяснение

Все дело в нарезке, так как мы получаем два смещения массива с одним смещением.Одно смещение происходит из-за длины окна последовательного поиска, равной 2.Итак, для длины окна поиска 3 нам нужно рассмотреть срезы массивов с двумя смещениями и так далее.Теперь вернемся к нашему упрощенному случаю с двумя последовательными окнами, у нас есть смещения с одним смещением.Мы сравниваем их с 1, что дает нам логические массивы совпадений.Затем наступает AND-ing, так что все окно закрыто.Наконец прыгает в нашем argmax, чтобы получить начало первого из этих островов !

Разбивка шагов должна помочь прояснить далее данный образец -

In [24]: a
Out[24]: array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1])

In [25]: a[:-1]
Out[25]: array([0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1])

In [26]: a[:-1]==1
Out[26]: 
array([False, False, False,  True, False, False,  True,  True, False,
        True,  True])

In [27]: a[1:]==1
Out[27]: 
array([False, False,  True, False, False,  True,  True, False,  True,
        True,  True])

In [28]: (a[:-1]==1) & (a[1:]==1)
Out[28]: 
array([False, False, False, False, False, False,  True, False, False,
        True,  True])

In [29]: ((a[:-1]==1) & (a[1:]==1)).argmax()
Out[29]: 6

Большее количество последовательных вхождений

Для большего количества минусов.В некоторых случаях мы можем прибегнуть к чему-то большему встроенному и использовать np.convolve, вот так -

In [20]: W = 2 # window-length

In [21]: np.convolve(a,[1]*W,'same').argmax()-W//2
Out[21]: 6

In [22]: W = 3

In [23]: np.convolve(a,[1]*W,'same').argmax()-W//2
Out[23]: 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...