Jzl5325
Jzl5325

Reputation: 3974

Get the number of nonzero elements in a numpy array?

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.

Upvotes: 6

Views: 12181

Answers (2)

Andrea Zonca
Andrea Zonca

Reputation: 8773

len(np.nonzero(array)[0]) ?

  • np.nonzero returns a tuple of indices, whose length is equal to the number of dimensions in the initial array
  • we get just the indices along the first dimension with [0]
  • compute its length with len

Upvotes: 3

DSM
DSM

Reputation: 353059

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 loop

In [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 loop

In [35]: timeit (a != 0).sum()
100000 loops, best of 3: 13.5 us per loop

In [36]: timeit np.count_nonzero(a)
1000000 loops, best of 3: 686 ns per loop

Upvotes: 16

Related Questions