如何从Python数组中获取连续整数子数组的开始和结束索引?

时间:2019-02-16 20:14:48

标签: python arrays numpy

我是编程新手,我有一个numpy数组作为(第一列是索引)

rows = np.array([5,6,7,8,14,15,16,31])

0 5
1 6
2 7
3 8
4 14
5 15
6 16
7 31 

我需要获取连续整数(例如0和3、4和6等)的子数组的开始和结束索引。 我试图这样做

start = np.array([])
end = np.array([])
c = 0
while c < len(rows):
   for i in range(c, len(rows)):
      if rows[i]-rows[i+1] > 1:
        np.append(start, c)
        np.append(end, i)
        c = i+1

这行不通,有什么建议吗?

3 个答案:

答案 0 :(得分:1)

这是使用itertools的单行解决方案:

list( itertools.filterfalse(lambda i: (i>0) and (rows[i]-rows[i-1] == 1), range(len(rows))) )

[0, 4, 7]

这是如何工作的?

  • 我们将itertools.filterfalse()应用于索引range(len(rows))的序列,即0..(len(rows)-1)
  • filterfalse()将给出我们选择的谓词函数为假的值,即,我们想查看那些连续的索引。因此,我们为其赋予函数lambda i: (rows[i]-rows[i-1] == 1)
    • 我们只需要进行调整,以便它在(i == 0)时也将其评估为False,因此我们添加了选通项:(i>0) and ...
  • 最后,我们将所有内容包装在list(...)中,以将迭代器转换回列表中

答案 1 :(得分:0)

要获取数组的第一个元素,请使用:a[0],以获取最后一个元素a[-1],其中a是数组。

答案 2 :(得分:0)

这是一种方法。请注意,我使用Python列表来累积所需的索引,并仅在最后将它们转换为numpy数组。我这样做是因为numpy数组并非旨在添加新成员-它们在固定大小的情况下效果最佳。有更多的Python方式可以做到这一点,但我试图保持与您在问题中所展示的知识相同。该代码的一个奇怪结果是,如果rows是一个空数组,则start变成array([0]),而end变成array([-1])。我的代码可以对非空数组正常工作。

import numpy as np

rows = np.array([5, 6, 7, 8, 14, 15, 16, 31])

startlist = [0]
endlist = []
for ndx in range(1, len(rows)):
    if rows[ndx] != rows[ndx - 1] + 1:
        startlist.append(ndx)
        endlist.append(ndx - 1)
endlist.append(len(rows) - 1)
start = np.array(startlist)
end = np.array(endlist)

结果是

start
Out[10]: array([0, 4, 7])

end
Out[11]: array([3, 6, 7])