如何从Python的一个阵列中启动和结束连续整数子阵列的索引



我是编程的新手,我有一个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

它不起作用,任何建议?

这是使用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()将提供我们选择的谓词函数为false的值。因此,我们将其授予功能lambda i: (rows[i]-rows[i-1] == 1)
    • 我们只需要调整它,以便它也将其评估为false at(i == 0),因此我们添加门控术语: (i>0) and ...
  • 最后,我们将所有这些包装在list(...)中,以将迭代器转换回列表

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

这是一种方法。请注意,我使用Python列表来累积所需的索引,并将它们仅在末尾转换为Numpy阵列。我这样做了,因为Numpy阵列并非旨在添加新成员 - 它们与固定尺寸的最佳作用。有更多的Pythonic方法可以做到这一点,但是我试图遵守您在问题中显示的知识。此代码的一个奇怪结果是,如果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])

最新更新