在Python中如何在scipy/numpy中高效查找非零区间?

4 投票
5 回答
2998 浏览
提问于 2025-04-15 21:29

假设我有一个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]]

撰写回答