闭合连续间隔的元组

时间:2014-11-24 15:55:50

标签: python algorithm numpy

说我有以下数字列表:

my_array = [0, 3, 4, 7, 8, 9, 10, 20, 21, 22, 70]

我想在此列表中找到包含连续整数无间隙的每个封闭间隔。如果列表中的任何数字都有多个这样的区间,我们只保留任何此类区间的最大。上面的正确答案应该是:

[0,   0]
[3,   4]
[7,  10]
[20, 22]
[70, 70]

要看到这一点,请注意例如:

  • 关闭的时间间隔[0,0]包含整数0,不包含任何间隙,并且其任何成员都不包含在任何其他关闭的时间间隔内。

  • 关闭区间[3,4]不包含任何间隙,其成员不包含在任何其他封闭区间内,且没有比自身大的间隙。

我怎么能在numpy中做到这一点?我开始编写一个使用np.diff(my_array)来检测数组中的转换的算法,但它在角落情况下失败,例如只包含一个项目的间隔。

2 个答案:

答案 0 :(得分:3)

我没有方便的numpy安装,但这是我采取的方法。首先分别处理空数组的情况。如果数组尚未排序,请对其进行排序,并使用np.diff来计算差异。

0, 3, 4, 7, 8, 9, 10,  20, 21, 22,  70
  3  1  3  1  1  1   10   1   1   48

测试> 1的差异。

  1  0  1  0  0  0    1   0   0    1

要获取间隔的开头,请在开头添加1并选择相应的数组项。要获得结束,请在末尾添加1并选择相应的数组项。

0, 3, 4, 7, 8, 9, 10,  20, 21, 22,  70
1  1  0  1  0  0   0    1   0   0    1
0  3     7             20           70

0, 3, 4, 7, 8, 9, 10,  20, 21, 22,  70
1  0  1  0  0  0   1    0   0   1    1
0     4           10           22   70

实施(主要由用户815423426):

def get_intervals(my_array):
  my_diff = np.diff(my_array)>1
  begins  = np.insert(my_diff, 0, 1)
  ends    = np.insert(my_diff, -1, 1)
  return np.array(np.dstack((my_array[begins], my_array[ends])))

my_array = np.array([0, 3, 4, 7, 8, 9, 10, 20, 21, 22, 70])
> get_intervals(my_array)
array([[ 0,  0],
       [ 3,  4],
       [ 7, 10],
       [20, 22],
       [70, 70]])

答案 1 :(得分:2)

纯python实现:

def findContinuousIntervals(numbers):
    if not numbers:
        return []

    sortedNumbers = sorted(numbers)

    result = [(sortedNumbers[0], sortedNumbers[0])]
    for n in sortedNumbers:
        a, b = result[-1]
        if abs(b - n) <= 1:
            result[-1] = (a, n)
        else:
            result.append((n, n))
    return result