我是编程新手,我有一个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
这行不通,有什么建议吗?
答案 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) 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])