计算numpy 2D矩阵中的“孔”

时间:2019-03-29 04:10:26

标签: python numpy vectorization

给出一个1和0的2D矩阵,例如-

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
       [0, 1, 1, 0, 0, 1, 0, 1, 0, 1],
       [1, 1, 0, 0, 1, 1, 0, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 0, 1, 0, 0],
       [1, 0, 0, 0, 1, 0, 1, 1, 0, 0],
       [1, 0, 0, 0, 1, 0, 1, 1, 1, 0],
       [1, 0, 0, 0, 1, 1, 0, 1, 1, 0]])

我希望计算某些统计数据:

1. Number of holes (no. of 0s with at least one 1 above): 12  
2. Sum of hole depths (no. of 1s above holes, summed across columns): 0+3+(1+1)+1+0+3+(2+8)+(2+1)+(1+1)+3 = 27  
3. Number of rows with at least one hole: 7  

通过使用scipy.ndimage.measurements.label对连续的0组进行计数,我能够做到1

In[2]: scipy.ndimage.measurements.label(arr == 0, 
                                        structure=[[0,1,0],  
                                                   [0,0,0],
                                                   [0,1,0]])[1] - arr.shape[1]

Out[2]: 12

如何找到23?我想避免使用循环。

1 个答案:

答案 0 :(得分:0)

这是使用xor和{ '{"name":"abc"}': '' } 的一种方法:

np.where