Поиск в массиве для вариаций - PullRequest
0 голосов
/ 10 мая 2018

У меня есть одномерный массив NumPy. Все в нем должно быть целым числом, кратным 10. Мне нужно найти его и найти где-нибудь, где мои целые числа больше 10, то есть 20, 30 и т. Д. И когда я нахожу одно, мне нужно иметь возможность определить значение из индексов, где происходит разрыв и использовать их для некоторой обработки. Мне также нужно возвращать отдельные значения, которые изолированы, и делать с ними что-то другое. Например,

0, 10, 20, 60, 80, 90, 100

От 0 до 20 - это один сет, поэтому мне нужно вернуть 0 и 20 и что-то сделать, а также от 80 до 100 - это набор, и то же самое должно произойти. Хотя 60 - это само по себе значение, поэтому мне нужно увидеть, что это просто отдельное значение и выполнить для него некоторую отдельную обработку, а затем вернуться к 80, чтобы получить правильный результат.

Я пытался придумать разумный способ сделать это с помощью numpy и ничего не придумал. Наборы данных очень большие, поэтому чем эффективнее, тем лучше. Теоретически не должно быть дублирования значений в наборах, и они всегда должны прогрессировать по мере продвижения по массиву. Спасибо за любую помощь заранее.

1 Ответ

0 голосов
/ 10 мая 2018

Вы, безусловно, можете сгруппировать значения в требуемые наборы. Есть несколько способов сделать это, например, закрытие:

import itertools as it

def gn(init=0):
    _x = init
    _count = 0
    def fn(x):
        nonlocal _count, _x
        _count += x - _x > 10
        _x = x
        return _count
    return fn

In []:
x = [0, 10, 20, 60, 80, 90, 100]
[list(g) for k, g in it.groupby(x, gn())]

Out[]:
[[0, 10, 20], [60], [80, 90, 100]]

или аналогично с классом:

class G:
    def __init__(self, init=0):
        self._x = init
        self._count = 0
    def __call__(self, x):
        self._count += x - self._x > 10
        self._x = x
        return self._count

In []:
x = [0, 10, 20, 60, 80, 90, 100]
[list(g) for k, g in it.groupby(x, G())]

Out[]:
[[0, 10, 20], [60], [80, 90, 100]]

Тогда вы можете просто перебрать эти группы, а если затем len() == 1 сделать что-то другое.

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