Подтвердить что ты не робот

Как найти группы последовательных элементов из массива в numpy?

Мне нужно сгруппировать последовательные элементы из массива numpy. учитывая следующий пример

    a = [ 0, 47, 48, 49, 50, 97, 98, 99]

На выходе должен быть список кортежей следующим образом

   [(0),(47, 48, 49, 50),(97, 98, 99)]

здесь разница только одна. между элементом. Будет здорово, если разницу можно также указать как предел или жесткий код.

Большое спасибо.

4b9b3361

Ответ 1

Здесь функция lil, которая может помочь:

def group_consecutives(vals, step=1):
    """Return list of consecutive lists of numbers from vals (number list)."""
    run = []
    result = [run]
    expect = None
    for v in vals:
        if (v == expect) or (expect is None):
            run.append(v)
        else:
            run = [v]
            result.append(run)
        expect = v + step
    return result

>>> group_consecutives(a)
[[0], [47, 48, 49, 50], [97, 98, 99]]
>>> group_consecutives(a, step=47)
[[0, 47], [48], [49], [50, 97], [98], [99]]

Ответ 2

def consecutive(data, stepsize=1):
    return np.split(data, np.where(np.diff(data) != stepsize)[0]+1)

a = np.array([0, 47, 48, 49, 50, 97, 98, 99])
consecutive(a)

дает

[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])]

Ответ 3

(a[1:]-a[:-1])==1 будет генерировать булевский массив, где False указывает на разрывы в прогонах. Вы также можете использовать встроенный numpy.grad.

Ответ 4

это то, что я придумал до сих пор: не уверен, что на 100% правильно

import numpy as np
a = np.array([ 0, 47, 48, 49, 50, 97, 98, 99])
print np.split(a, np.cumsum( np.where(a[1:] - a[:-1] > 1) )+1)

возвращает:

>>>[array([0]), array([47, 48, 49, 50]), array([97, 98, 99])]

Ответ 5

Это звучит немного как домашнее задание, поэтому, если вы не возражаете, я предлагаю подход

Вы можете перебирать список, используя

for i in range(len(a)):
    print a[i]

Вы можете проверить, что следующий элемент в списке соответствует некоторым критериям, например, следующим

if a[i] == a[i] + 1:
    print "it must be a consecutive run"

И вы можете хранить результаты отдельно в

results = []

Остерегайтесь - в приведенной выше ссылке указана ошибка, исключенная из диапазона, вам нужно будет иметь дело с