Как найти группы последовательных элементов из массива в NumPy? - PullRequest
51 голосов
/ 08 сентября 2011

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

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

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

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

здесь разница только одна. между элементом. Было бы здорово, если бы разницу можно было также указать как ограничение или жестко закодированное число.

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

Ответы [ 5 ]

147 голосов
/ 08 сентября 2011
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])]
17 голосов
/ 08 сентября 2011

Вот функция, которая может помочь:

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]]
10 голосов
/ 08 сентября 2011

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

5 голосов
/ 08 сентября 2011

это то, что я до сих пор придумал: не уверен, что 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])]
0 голосов
/ 08 сентября 2011

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

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

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

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

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

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

results = []

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

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