2
$\begingroup$

I have a list containing zero and nonzero elements. How can I throw away zero elements and just keep non zero ones.

$\endgroup$
  • $\begingroup$ Cases[{0, f, y, e, 1, 2, 3}, Except[0]] $\endgroup$ – Rorschach Feb 26 '14 at 15:46
  • 2
    $\begingroup$ DeleteCases[list,0] $\endgroup$ – Coolwater Feb 26 '14 at 16:12
  • $\begingroup$ Instead of either of the two suggestions above, I recommend Select[list, # != 0 &] for the reason that pattern matching differentiates between 0. and 0 while == has a small tolerance even for machine precision zeros. Pattern matching can be fixed by using 0|0. in place of 0. $\endgroup$ – Szabolcs Feb 26 '14 at 16:16
7
$\begingroup$

Use

Select[list, # != 0 &]

for the simplest solution.


A non-obvious solution that can be quite fast (for versions $\ge 8$), especially for packed arrays, is

Pick[list, Unitize[list], 1]

This'll give you better performance than Select.


A warning about pattern matching: it differentiates between exact 0 and inexact 0., thus

In[2]:= DeleteCases[{0., 0, 1}, 0]
Out[2]= {0., 1}

In[3]:= DeleteCases[{0., 0, 1}, 0.]
Out[3]= {0, 1}

You can use the pattern 0|0. but using comparison (== or !=) is both clearer and == allows for greater differences from zero (that might arise due to numerical roundoff errors during calculations) than === and pattern matching. So I recommend ==. (You might google for Internal`$EqualTolerance and Internal`$SameQTolerance if you wish to learn about these tolerances.)

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.