计算Python中非零值的簇数?

Tim*_*ice 7 python numpy pandas

我的数据看起来像这样:

a=[0,0,0,0,0,0,10,15,16,12,11,9,10,0,0,0,0,0,6,9,3,7,5,4,0,0,0,0,0,0,4,3,9,7,1]
Run Code Online (Sandbox Code Playgroud)

基本上,在非零数字之前有一堆零,我想要计算由零分隔的非零数字组的数量.在上面的示例数据中,有3组非零数据,因此代码应返回3.

  • 非零组之间的零数是可变的

有什么好办法在python中做到这一点?(还使用Pandas和Numpy来帮助解析数据)

Div*_*kar 6

随着a作为输入数组,我们可以有一个量化的解决方案-

m = a!=0
out = (m[1:] > m[:-1]).sum() + m[0]
Run Code Online (Sandbox Code Playgroud)

作为性能的替代方案,我们可能会使用np.count_nonzero非常有效的方法来计算bool,就像这样的情况,如此 -

out = np.count_nonzero(m[1:] > m[:-1]) + m[0] 
Run Code Online (Sandbox Code Playgroud)

基本上,我们得到一个掩码non-zeros并计算上升沿.为了考虑第一个也可能非零且不会有任何上升边缘的元素,我们需要检查它并添加到总和中.

此外,请注意,如果输入a是一个列表,我们需要使用m = np.asarray(a)!=0.

样本运行三个案例 -

In [92]: a  # Case1 :Given sample
Out[92]: 
array([ 0,  0,  0,  0,  0,  0, 10, 15, 16, 12, 11,  9, 10,  0,  0,  0,  0,
        0,  6,  9,  3,  7,  5,  4,  0,  0,  0,  0,  0,  0,  4,  3,  9,  7,
        1])

In [93]: m = a!=0

In [94]: (m[1:] > m[:-1]).sum() + m[0]
Out[94]: 3

In [95]: a[0] = 7  # Case2 :Add a non-zero elem/group at the start

In [96]: m = a!=0

In [97]: (m[1:] > m[:-1]).sum() + m[0]
Out[97]: 4

In [99]: a[-2:] = [0,4] # Case3 :Add a non-zero group at the end

In [100]: m = a!=0

In [101]: (m[1:] > m[:-1]).sum() + m[0]
Out[101]: 5
Run Code Online (Sandbox Code Playgroud)