Python / numpy: все значения в массиве до х? - PullRequest
3 голосов
/ 10 марта 2011

У меня есть такой упорядоченный массив: numpy.array([1, 2, 5, 10, 25, 36, 66, 90, 121, 230, 333, 500])

Предположим, мне нужны все значения до 60 (если 60 не включено, я хочу остановиться на первом значении больше 60), поэтому я хочу [1, 2, 5, 10, 25, 36, 66]. Если я использую numpy.where() с <= 60, он останавливается до 66. </p>

Мое решение

from numpy import *
x = array([1, 2, 5, 10, 25, 36, 66, 90, 121, 230, 333, 500])
print x[:where(x >= 60)[0][0]+1]
>>>[ 1  2  5 10 25 36 66]

Ответы [ 2 ]

10 голосов
/ 11 марта 2011

для этого есть специальная функция numpy, np.searchsorted, которая намного быстрее, чем пополам.

a=np.arange(1e7)
c=2e6
%timeit bisect.bisect(a,c)
10000 loops, best of 3: 31.6 us per loop
%timeit np.searchsorted(a,c)
100000 loops, best of 3: 6.77 us per loop

Более примечательно, что у него есть также специальное ключевое слово side для включения или не последнего пункта:

In [23]: a[:a.searchsorted(66,side='right')]
Out[23]: array([ 1,  2,  5, 10, 25, 36, 66])

In [24]: a[:a.searchsorted(66,side='left')]
Out[24]: array([ 1,  2,  5, 10, 25, 36])
2 голосов
/ 10 марта 2011

Вам не нужно ничего особенного в numpy для этого.

import numpy, bisect
a = numpy.array([1, 2, 5, 10, 25, 36, 66, 90, 121, 230, 333, 500])
idx = bisect.bisect(a, 60)
print a[:idx]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...