How do I remove all zero elements from a NumPy array? How do I remove all zero elements from a NumPy array? python python

How do I remove all zero elements from a NumPy array?


For a NumPy array a, you can use

a[a != 0]

to extract the values not equal to zero.


This is a case where you want to use masked arrays, it keeps the shape of your array and it is automatically recognized by all numpy and matplotlib functions.

X = np.random.randn(1e3, 5)X[np.abs(X)< .1]= 0 # some zerosX = np.ma.masked_equal(X,0)plt.boxplot(X) #masked values are not plotted#other functionalities of masked arraysX.compressed() # get normal array with masked values removedX.mask # get a boolean array of the maskX.mean() # it automatically discards masked values


I decided to compare the runtime of the different approaches mentioned here. I've used my library simple_benchmark for this.

The boolean indexing with array[array != 0] seems to be the fastest (and shortest) solution.

enter image description here

For smaller arrays the MaskedArray approach is very slow compared to the other approaches however is as fast as the boolean indexing approach. However for moderately sized arrays there is not much difference between them.

Here is the code I've used:

from simple_benchmark import BenchmarkBuilderimport numpy as npbench = BenchmarkBuilder()@bench.add_function()def boolean_indexing(arr):    return arr[arr != 0]@bench.add_function()def integer_indexing_nonzero(arr):    return arr[np.nonzero(arr)]@bench.add_function()def integer_indexing_where(arr):    return arr[np.where(arr != 0)]@bench.add_function()def masked_array(arr):    return np.ma.masked_equal(arr, 0)@bench.add_arguments('array size')def argument_provider():    for exp in range(3, 25):        size = 2**exp        arr = np.random.random(size)        arr[arr < 0.1] = 0  # add some zeros        yield size, arrr = bench.run()r.plot()