<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 16, 2019 at 5:58 AM Charles R Harris <<a href="mailto:charlesr.harris@gmail.com">charlesr.harris@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 16, 2019 at 3:44 AM Kevin Sheppard <<a href="mailto:kevin.k.sheppard@gmail.com" target="_blank">kevin.k.sheppard@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I am trying to make a subclass that never propagates so that when interacted with another ndarray, or even itself so that the return type is always ndarray.  Is this possible?<br><br>I got pretty far with<br><br>def __array_wrap__(self, out_arr, context=None):<br>    if out_arr.shape == ():<br>        return out_arr.item()  # if ufunc output is scalar, return it<br>    else:<br>        out = super(ArrayLike, self).__array_wrap__(out_arr, context)<br>        # Never return ArrayLike<br>        if isinstance(out, ArrayLike):<br>            out = out.view(np.ndarray)<br>        return out<br><br>Which works well for ufuncs.  However, when I try other functions like `dot` I get my subclass type returned. <br><br>If there a reasonable way to ensure that my subclass doesn't propagate? I think I would need some way to override the behavior when .view(MySubClass) is called.<br></div></blockquote></div></div></blockquote><div><br></div><div>I think you need to implement __array_finalize__ for this (see e.g. <a href="https://docs.scipy.org/doc/numpy-1.13.0/user/basics.subclassing.html#implications-for-subclassing">https://docs.scipy.org/doc/numpy-1.13.0/user/basics.subclassing.html#implications-for-subclassing</a>)</div><div><br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br></div></blockquote><div><br></div><div>I think you will be able to do that with `__array_function__` in the upcoming 1.17 release. It is also in 1.16, but you need an environmental variable to activate it. Some documentation can be found at <a href="https://www.numpy.org/devdocs/reference/arrays.classes.html#special-attributes-and-methods" target="_blank">https://www.numpy.org/devdocs/reference/arrays.classes.html#special-attributes-and-methods</a>.</div></div></div></blockquote><div><br></div><div>That's kind of an orthogonal thing: __array_function__ is for providing your own implementation of functions, which you don't necessarily want to do if you're just building a small subclass.</div><div><br></div><div>Cheers,<br></div><div>Ralf</div><div><br></div></div></div>