On 08/05/2009 09:18 AM, Keith Goodman wrote:
On Wed, Aug 5, 2009 at 1:40 AM, Bruce Southey<[email protected]>  wrote:
On Tue, Aug 4, 2009 at 4:05 PM, Keith Goodman<[email protected]>  wrote:
On Tue, Aug 4, 2009 at 1:53 PM, Bruce Southey<[email protected]>  wrote:
On Tue, Aug 4, 2009 at 1:40 PM, Gökhan Sever<[email protected]>  wrote:
This is the loveliest of all solutions:

c[isfinite(c)].mean()
This handling of nonfinite elements has come up before.
Please remember that this only for 1d or flatten array so it not work
in general especially along an axis.
If you don't want to use nanmean from scipy.stats you could use:

np.nansum(c, axis=0) / (~np.isnan(c)).sum(axis=0)

or

np.nansum(c, axis=0) / (c == c).sum(axis=0)

But if c contains ints then you'll run into trouble with the division,
so you'll need to protect against that.
That is not a problem because nan and infinity are only defined for
floating point numbers not integers. So any array that have nonfinite
elements like nans and infinity must have a floating point dtype.

That is true. But I was thnking of this case (no nans or infs):

c
array([[1, 2, 3],
        [4, 5, 6]])
c.mean(0)
    array([ 2.5,  3.5,  4.5])<--- good
np.nansum(c, axis=0) / (c == c).sum(axis=0)
    array([2, 3, 4])<--- bad
np.nansum(c, axis=0) / (c == c).sum(axis=0, dtype=np.float)
    array([ 2.5,  3.5,  4.5])<--- good
_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion
Sure but that is about ints versus floats and not about nans or infs. Your 'good' examples are really about first converting an int array into a float array and your 'bad' example maintains int dtype (same result if you cast the arrays from 'good' approaches back to an int dtype).

The correct answer depends on what you want the dtype to be. For example,
With floating point division:
np.mean(c/0.0,axis=0)

gives the expected floating point answer:
array([ Inf,  Inf,  Inf])

With integer division:
np.mean(c/0,axis=0)

gives the expected integer answer:
array([ 0.,  0.,  0.])

Note the default action of mean is to convert ints to float64 which is why the output is a float instead of an int. Although the numpy.mean dtype argument does not appear to work for int dtypes.


Bruce
_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to