如何在numpy中找到数组中连续元素的组?

时间:2011-09-08 18:21:36

标签: python numpy

我必须从numpy数组中对连续元素进行聚类。考虑以下示例

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

输出应该是一个元组列表,如下所示

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

这里差别只有一个。元素之间。如果差异也可以指定为限制或硬编码,那将是很好的。

非常感谢。

6 个答案:

答案 0 :(得分:141)

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])]

答案 1 :(得分:16)

这是一个可能有帮助的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 :(得分:10)

(a[1:]-a[:-1])==1将生成一个布尔数组,其中False表示运行中断。您也可以使用内置的numpy.grad

答案 3 :(得分:5)

这是我到目前为止所提出的:不确定是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])]

答案 4 :(得分:0)

这听起来有点像家庭作业,所以如果你不介意我会提出一个方法

您可以使用

迭代列表
for i in range(len(a)):
    print a[i]

您可以测试列表中的下一个元素是否符合以下条件

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

您可以单独存储结果

results = []

注意 - 上面隐藏的索引超出范围错误,您将需要处理

答案 5 :(得分:0)

针对一维数组进行了测试

获取 diff 不存在的地方

diffs = numpy.diff(array) != 1

获取差异索引,获取第一个维度,然后将所有维度相加,因为 diff 与上一个索引进行比较

indexes = numpy.nonzero(diffs)[0] + 1

使用给定索引分割

groups = numpy.split(array, indexes)