简体   繁体   中英

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.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM