[Numpy-discussion] Re: ndarray.fill and ma.array.filled

Sasha ndarray at mac.com
Mon Apr 10 11:37:00 CDT 2006

On 4/10/06, Pierre GM <pgmdevlist at mailcan.com> wrote:
> > If you sum along a particular dimension and encounter a masked value,
> > the result is masked.
> That's not how it currently works (still on 0.9.6):
> [... longish example snipped ...]

>>> ma.array([1,1], mask=[0,1]).sum()

> and frankly, I'd be quite frustrated if it had to change:
> - `filled` is not a ndarray method, which means that a.filled(0).sum() fails
> if a is not MA. Right now, I can use a.sum() without having to check the
> nature of a first.

This is exactly the point of the current discussion: make fill a
method of ndarray.
With the current behavior, how would you achieve masking (no fill) a.sum()?

> - this behavior was already in Numeric

That's true, but it makes the result of sum(a) different from
__builtins__.sum(a).  I believe consistency with the python
conventions is more important than with legacy Numeric in the long

> [...]

> - The current way reflects how mask are used in GIS or image processing.
Can you elaborate on this? Note that in R na.rm is false by default in sum:

> sum(c(1,NA))
[1] NA

So it looks like the convention is different in the field of statistics.

> > If you would like to ignore masked values, you write
> > a.filled(0).sum() instead of a.sum(). In 1d case, you can also use
> > a.compress().sum().
> Once again, Sasha, I'd agree with you if it wasn't a major difference

Array methods are a very recent addition to ma.  We can still use this
window of opportunity to get things right before to many people get
used to the wrong behavior.  (Note that I changed your implementation
of cumsum and cumprod.)

> > In other words, what in R you achieve with a
> > flag, such as in sum(a, na.rm=TRUE), in numpy you achieve by an
> > explicit call to "fill".  This is not quite the same as na.actions in
> > R, but that is what I had in mind.
> I kinda like the idea of a flag, though

With the flag approach making ndarray and ma.array interfaces
consistent would require adding an extra argument to many methods. 
Instead, I poropose to add one method: fill to ndarray.

More information about the Numpy-discussion mailing list