Is it possible to get the length of the nonzero elements in a numpy array without iterating over the array or masking the array. Speed is the main goal of calculating the length.
Essentially, something like len(array).where(array != 0)
.
If it changes the answer, each row will begin with zeros. The array is filled on the diagonal with zeros.
Assuming you mean total number of nonzero elements (and not total number of nonzero rows):
In [12]: a = np.random.randint(0, 3, size=(100,100))In [13]: timeit len(a.nonzero()[0])
1000 loops, best of 3: 306 us per loopIn [14]: timeit (a != 0).sum()
10000 loops, best of 3: 46 us per loop
or even better:
In [22]: timeit np.count_nonzero(a)
10000 loops, best of 3: 39 us per loop
This last one, count_nonzero
, seems to behave well when the array is small, too, whereas the sum
trick not so much:
In [33]: a = np.random.randint(0, 3, size=(10,10))In [34]: timeit len(a.nonzero()[0])
100000 loops, best of 3: 6.18 us per loopIn [35]: timeit (a != 0).sum()
100000 loops, best of 3: 13.5 us per loopIn [36]: timeit np.count_nonzero(a)
1000000 loops, best of 3: 686 ns per loop