Проверьте, находится ли данное значение между любыми числами в данном массиве - PullRequest
1 голос
/ 13 апреля 2020

Рассмотрим заданный массив:

import numpy as np
borders = np.array([[ 7848, 10705],
                    [10861, 13559],
                    [13747, 16319],
                    [16792, 19427],
                    [19963, 22535]])

Как проверить, находится ли заданное значение между этими интервалами?

Я определил пользовательскую функцию, например:

def _if_between(value, arr):
    for borders in arr:
        if borders[0] <= value <= borders[1]:
            return True

    return False

И это работает. Есть ли более аккуратный способ сделать это? Может быть, используя numpy или a.any() et c.?

Ожидаемый выход:

  • для 6000, он должен вернуть False,
  • для 10861, должно возвращаться True

Ответы [ 6 ]

2 голосов
/ 13 апреля 2020

Вы можете проверить это простым способом:

def _if_between(value, arr):
    for borders in arr:
        return value in range(borders[0], borders[1])

2 голосов
/ 13 апреля 2020

Если вам не нужно знать, в каком индексе находится элемент, вы можете векторизовать l oop как:

import numpy as np

def _if_between(value, arr):
    return np.any( np.logical_and(borders[:,0] <= value, value <=borders[:,1]))
1 голос
/ 13 апреля 2020

Использование чистого Python без каких-либо модулей и использование любых списков плюсов:

# Assumes borders is an array of pairs
def _if_between(value, borders):
  return any( [min <= value and max >= value for min, max in borders] )
1 голос
/ 13 апреля 2020

Вот небольшое улучшение:

def _if_between(value, arr):
        if any([borders[0] <= value <= borders[1] for borders in arr]):
            return True
        return False
0 голосов
/ 13 апреля 2020

Pandas 1.0.3 имеет тип IntervalArray , который имеет метод содержимого для проверки, существует ли число в каком-либо интервале в массиве:

import pandas as pd

borders = [
    [ 7848, 10705],
    [10861, 13559],
    [13747, 16319],
    [16792, 19427],
    [19963, 22535]
]
intervals = pd.arrays.IntervalArray.from_tuples(borders)
result = intervals.contains(19426)

будет выглядеть переменная результата следующим образом:

array([False, False, False,  True, False])
0 голосов
/ 13 апреля 2020

Делать это на чистом Python лучше. Но вы можете сделать свой код быстрее, чем простой l oop.

value = 10869
[True if border[0] <= value <= border[1] else False for border in borders]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...