Как найти группы последовательных элементов из массива в numpy?
Мне нужно сгруппировать последовательные элементы из массива numpy. учитывая следующий пример
a = [ 0, 47, 48, 49, 50, 97, 98, 99]
На выходе должен быть список кортежей следующим образом
[(0),(47, 48, 49, 50),(97, 98, 99)]
здесь разница только одна. между элементом. Будет здорово, если разницу можно также указать как предел или жесткий код.
Большое спасибо.
Ответы
Ответ 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 = []
Остерегайтесь - в приведенной выше ссылке указана ошибка, исключенная из диапазона, вам нужно будет иметь дело с