Нумеровое первое значение значения больше существующего значения

У меня есть 1D-массив в numpy, и я хочу найти позицию индекса, где значение превышает значение в массиве numpy.

например.

aa = range(-10,10)

Найти позицию в aa, где значение 5 будет превышено.

Ответ 1

Это немного быстрее (и выглядит лучше)

np.argmax(aa>5)

Так как argmax останавливается при первом True ( "В случае множественных вхождений максимальных значений, индексы, соответствующие первое вхождение возвращается." ) и не сохраняет другой список.

In [2]: N = 10000

In [3]: aa = np.arange(-N,N)

In [4]: timeit np.argmax(aa>N/2)
100000 loops, best of 3: 52.3 us per loop

In [5]: timeit np.where(aa>N/2)[0][0]
10000 loops, best of 3: 141 us per loop

In [6]: timeit np.nonzero(aa>N/2)[0][0]
10000 loops, best of 3: 142 us per loop

Ответ 2

учитывая отсортированный контент вашего массива, существует еще более быстрый метод: searchsorted.

import time
N = 10000
aa = np.arange(-N,N)
%timeit np.searchsorted(aa, N/2)+1
%timeit np.argmax(aa>N/2)
%timeit np.where(aa>N/2)[0][0]
%timeit np.nonzero(aa>N/2)[0][0]

# Output
100000 loops, best of 3: 5.97 µs per loop
10000 loops, best of 3: 46.3 µs per loop
10000 loops, best of 3: 154 µs per loop
10000 loops, best of 3: 154 µs per loop

Ответ 3

In [34]: a=np.arange(-10,10)

In [35]: a
Out[35]:
array([-10,  -9,  -8,  -7,  -6,  -5,  -4,  -3,  -2,  -1,   0,   1,   2,
         3,   4,   5,   6,   7,   8,   9])

In [36]: np.where(a>5)
Out[36]: (array([16, 17, 18, 19]),)

In [37]: np.where(a>5)[0][0]
Out[37]: 16