在Python中如何在scipy/numpy中高效查找非零区间?
假设我有一个Python列表或者一个一维数组(用numpy表示)。假设这个列表或数组中有一段连续的非零元素,我该怎么找到这段非零元素的开始和结束位置(也就是索引)呢?比如,
a = [0, 0, 0, 0, 1, 2, 3, 4]
当我调用nonzero_coords(a)时,它应该返回[4, 7]。对于:
b = [1, 2, 3, 4, 0, 0]
当我调用nonzero_coords(b)时,它应该返回[0, 2]。
谢谢。
5 个回答
1
其实,nonzero_coords(b) 应该返回 [0, 3]。输入中可以出现多个空洞吗?如果可以,那该怎么办呢?一个简单的解决办法是:先扫描到第一个非零元素,然后再扫描到最后一个非零元素。下面是代码(抱歉没有测试过):
a = [0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 0]
start = 0
size = len(a) #
while (start < size and a[start] != 0): start += 1
end = start
while (end < size and a[end] != 0): end += 1
return (start, end)
2
这个方法对我处理多个孔洞很有效。
from numpy import *
def nonzero_intervals(value):
lvalue = array(value)
lvalue[0] = 0
lvalue[-1] = 0
a = diff((lvalue==0) * 1)
intervals = zip( find(a == -1),find(a == 1))
return intervals
4
假设有一段连续的非零元素...
x = nonzero(a)[0]
result = [x[0], x[-1]]