[Numpy-discussion] Should ndarray subclasses support the keepdims arg?

Allan Haldane allanhaldane at gmail.com
Tue May 5 18:46:24 EDT 2015

That makes sense. I think it's the way to go, thanks.

The downside is using **kwargs instead of an explicit keepdims arg gives
a more obscure signature, but using the new __signature__ attribute this
could be hidden for python 3 users and python2 using ipython3+.

On 05/05/2015 01:55 PM, Nathaniel Smith wrote:
> AFAICT the only real solution here is for np.sum and friends to
> propagate the keepdims argument if and only if it was explicitly passed
> to them (or maybe the slightly different, if and only if it has a
> non-default value). If we just started requiring code to handle it and
> passing it unconditionally, then as soon as someone upgraded numpy all
> their existing code might break for no good reason.
> On May 5, 2015 8:13 AM, "Allan Haldane" <allanhaldane at gmail.com
> <mailto:allanhaldane at gmail.com>> wrote:
>     Hello all,
>     A question:
>     Many ndarray methods (eg sum, mean, any, min) have a "keepdims" keyword
>     argument, but ndarray subclass methods sometimes don't. The 'matrix'
>     subclass doesn't, and numpy functions like 'np.sum' intentionally
>     drop/ignore the keepdims argument when called with an ndarray subclass
>     as first argument.
>     This means you can't always use ndarray subclasses as 'drop in'
>     replacement for ndarrays if the code uses keepdims (even indirectly),
>     and it means code that deals with keepdims (eg np.sum and more) has to
>     detect ndarray subclasses and drop keepdims even if the subclass
>     supports it (since there is no good way to detect support). It seems to
>     me that if we are going to use inheritance, subclass methods should keep
>     the signature of the parent class methods. What does the list think?
>     ---- Details: ----
>     This problem comes up in a PR I'm working on (#5706) to add the keepdims
>     arg to masked array methods. In order to support masked matrices (which
>     a lot of unit tests check), I would have to detect and drop the keepdims
>     arg to avoid an exception. This would be solved if the matrix class
>     supported keepdims (plus an update to np.sum). Similarly,
>     `np.sum(mymaskedarray, keepdims=True)` does not respect keepdims, but it
>     could work if all subclasses supported keepdims.
>     I do not foresee immediate problems with adding keepdims to the matrix
>     methods, except that it would be an unused argument. Modifying `np.sum`
>     to always pass on the keepdims arg is trickier, since it would break any
>     code that tried to np.sum a subclass that doesn't support keepdims, eg
>     pandas.DataFrame. **kwargs tricks might work. But if it's permissible I
>     think it would be better to require subclasses to support all the
>     keyword args ndarray supports.
>     Allan
>     _______________________________________________
>     NumPy-Discussion mailing list
>     NumPy-Discussion at scipy.org <mailto:NumPy-Discussion at scipy.org>
>     http://mail.scipy.org/mailman/listinfo/numpy-discussion
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion

More information about the NumPy-Discussion mailing list