我是编程的新手,我有一个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 ...
- 我们只需要调整它,以便它也将其评估为false at(i == 0),因此我们添加门控术语:
- 最后,我们将所有这些包装在
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])