Delete columns of a matrix that are mostly zero

numpy, python

Solution

How about:

>>> a[:, (a != 0).sum(axis=0) >= 5]
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1],
       [1, 1, 3],
       [1, 1, 3],
       [1, 1, 5],
       [1, 1, 1],
       [1, 1, 1],
       [1, 1, 3],
       [1, 1, 4],
       [1, 1, 5],
       [1, 1, 0]])

or

>>> a[:, np.apply_along_axis(np.count_nonzero, 0, a) >= 5]
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1],
       [1, 1, 3],
       [1, 1, 3],
       [1, 1, 5],
       [1, 1, 1],
       [1, 1, 1],
       [1, 1, 3],
       [1, 1, 4],
       [1, 1, 5],
       [1, 1, 0]])

In the past I've found `np.count_nonzero` to be much faster than the `sum` trick, but here -- probably because of the need to use `np.appyly_along_axis` -- that version is instead much slower, at least for this `a`. Some other tests showed the same even for larger matrices, but YMMV.

Problem

In this case, mostly means less than 5 elements are non-zero in a column. Matrix is a 2d ndarray. Sample data: ``` a = np.array([[1,1,2,1,1], [1,1,0,1,0], [1,1,0,1,0], [1,1,0,3,0], [1,1,0,3,0], [1,1,1,5,3], [1,1,0,1,0], [1,1,0,1,0], [1,1,4,3,0], [1,1,0,4,0], [1,1,0,5,0], [1,1,0,0,0]]) ``` Output ``` a = np.array([[1,1,1], [1,1,1], [1,1,1], [1,1,3], [1,1,3], [1,1,5], [1,1,1], [1,1,1], [1,1,3], [1,1,4], [1,1,5], [1,1,0]]) ```

Original source