I have for example the following np array
array([[ True, False, False],
[False, True, True],
[ True, True, True],
[False, True, True],
[False, True, True],
[ True, False, False],
[ True, True, False],
[False, False, True]])
I want to count the number of consecutive Trues along the columns, so in the above example, the first column contains 3 blocks of consecutive Trues, the second column contains 2 blocks, and the third contains 2 blocks. The output should then be
array([3, 2, 2])
I know I can do loops for each columns, like in this answer for a one-dimensional array, but what is a numpy-way for doing this on a 2-d array?
>Solution :
Use boolean arithmetic to identify the True
that are not followed by a True
(using slicing and pad
), then sum
the True
per column:
out = ((a != np.pad(a[1:], ((0,1), (0,0)), constant_values=False))
& a).sum(axis=0)
Or:
out = (a & ~np.pad(a[1:], ((0,1), (0,0)), constant_values=False)).sum(axis=0)
Output:
array([3, 2, 2])