Определение, где значение лежит из списка интервалов (синтетическое решение) - PullRequest
1 голос
/ 13 мая 2019

У меня есть список l возрастающих значений, например

import numpy as np
l=np.linspace(0.,1.,10)

Для числа a=0.225 я хочу найти индекс i такой, что l[i]<a<l[i+1]. Конечно, я могу сделать

for j in range(len(l)-1):
    if l[j]<a<l[j+1]:
        i=j
        break

но есть ли более синтетический способ сделать это?

Ответы [ 2 ]

4 голосов
/ 13 мая 2019

Как уже упоминалось в комментариях, для сортировки l мы можем использовать np.searchsorted -

np.searchsorted(l,a,'right')-1

Или с np.digitize -

np.digitize(a,l,right=True)-1
1 голос
/ 13 мая 2019

Для чисто Python-решения существует модуль bisect:

>>> from bisect import bisect_left
>>> a = list(range(1, 10))
>>> bisect_left(a, 3.5)
3

или с NumPy:

>>> from bisect import bisect_left
>>> import numpy as np
>>> l = np.linspace(0, 1, 10)
>>> bisect_left(l, 0.225)
3

bisect.bisect_left(a, x, lo=0, hi=len(a))

Найдите точку вставки для х в, чтобы поддерживать отсортированный порядок. Параметры lo и hi могут быть используется для указания подмножества списка, который следует учитывать; от по умолчанию используется весь список. Если x уже присутствует в a, точка вставки будет перед (слева) от любых существующих записей. Возвращаемое значение подходит для использования в качестве первого параметра list.insert() при условии, что a уже отсортировано.

Возвращенная точка вставки i разбивает массив a на две половины так что all(val < x for val in a[lo:i]) для левой стороны и all(val >= x for val in a[i:hi]) для правой стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...