[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