Re: Counting nonzeros
- To: mathgroup at smc.vnet.net
- Subject: [mg86885] Re: Counting nonzeros
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Tue, 25 Mar 2008 01:16:00 -0500 (EST)
- Organization: The Open University, Milton Keynes, UK
- References: <fs7iml$gma$1@smc.vnet.net>
carlos at colorado.edu wrote:
> I want to count the # of NZ entries in an arbitrary multilevel list,
> say exp, that contains only integers. Is this the easiest way:
>
> k = Length[Flatten[exp]]-Count[Flatten[exp],0]
The "easiest way" might be in the eye of the beholder! What about the
following?
k = Total@Unitize@Flatten@exp (* Fastest Solution *)
k = Count[exp, x_Integer /; x != 0, -1] (* Slower Solution *)
The first expression uses Unitize to get a list of 0's and 1's only
(every non zero entry is set to one).
The second expression uses pattern matching and the third parameter of
Count (setting level to -1 tells Mathematica to look for numbers,
symbols and other objects that do not have subparts) to count the non
zero entries.
Here are the timings for each approach (we create some arbitrary integer
data in the interval [-1, 1] first)
In[1]:= exp = RandomInteger[{-1, 1}, {10, 10, 10}];
In[2]:= Timing@Total@Unitize@Flatten@exp
Out[2]= {0.000083, 702}
In[3]:= Timing@(Length[Flatten[exp]] - Count[Flatten[exp], 0])
Out[3]= {0.000172, 702}
In[4]:= Timing@Count[exp, x_Integer /; x != 0, -1]
Out[4]= {0.000736, 702}
Regards,
--
Jean-Marc