Thanks for the concerns raised, and Stephan for promptly answering them. > An alternative to introducing np.duckarray() would be to just modify > np.asarray(). Of course this has backwards compatibility impact, but if > you're going to be raising a TypeError from __array__ then that impact is > there anyway. Note: I don't think this is necessarily a better idea, because > it may lead to less clear errors, but it's worth putting in the alternatives > section at least.
I don't know if mentioning alternatives in that way is good, it gives me the impression that NumPy is encouraging them (unless it really is). In that sense, I think the best is indeed going down the path of finding a good coercion solution (as Stephan already mentioned) and later we could just add a pointer to the new NEP in this one. Best, Peter On Tue, Aug 6, 2019 at 3:17 AM Stephan Hoyer <sho...@gmail.com> wrote: > > On Mon, Aug 5, 2019 at 2:48 PM Ralf Gommers <ralf.gomm...@gmail.com> wrote: >> >> Having __array__ give a TypeError is fine for libraries that want to prevent >> unintentional coercion with, e.g., `np.asarray(my_ducktype)`. However that >> leaves the obvious question of what the right way is to do this >> intentionally. Would be good to recommend something, for example a `numpy()` >> or `to_numpy()` method. Also, the NEP should make it clearer that this is >> not the obviously correct thing to do, it only makes sense in cases where >> coercion is very expensive, like CuPy and Sparse. For Dask for example, >> coercion to a numpy array is perfectly reasonable. > > > I agree, we need another solution for explicit array conversion, either from > duck arrays to NumPy arrays or between duck arrays. > > As has come-up on GitHub [1], think this should probably be another protocol, > to allow for third-party conversions like sparse <-> dask that in principle > could be implemented by either library. > > To get discussion start, here's one possible proposal for what the NumPy > API(s) could look like: > np.coerce(sparse_array) # by default, coerce to np.ndarray > np.coerce(sparse_array, dask.array.Array) # coerces to dask > np.coerce_like(sparse_array, dask_array) # coerce like the second array type > np.coerce_arrays(list_of_arrays) # coerce to first type that can handle > everything > > The protocol itself should probably either use __array_function__ (e.g., for > np.coerce_like, if all the dispatched on arguments are arrays) or a custom > protocol in the same style that allows for implementations on either the > array being converted or the type of the result [2]. > > [1] https://github.com/numpy/numpy/issues/13831 > [2] https://github.com/numpy/numpy/pull/14170#issuecomment-517004293 > >> >> The NEP currently does not say who this is meant for. Would you expect >> libraries like SciPy to adopt it for example? >> >> The NEP also (understandably) punts on the question of when something is a >> valid duck array. If you want this to be widely used, that will need an >> answer or at least some rough guidance though. For example, we would expect >> a duck array to have a mean() method, but probably not a ptp() method. A >> library author who wants to use np.duckarray() needs to know, because she >> can't test with all existing and future duck array implementations. > > > I think this is covered in NEP-22 already. As discussed there, I don't think > NumPy is in a good position to pronounce decisive APIs at this time. I would > welcome efforts to try, but I don't think that's essential for now. > >> An alternative to introducing np.duckarray() would be to just modify >> np.asarray(). Of course this has backwards compatibility impact, but if >> you're going to be raising a TypeError from __array__ then that impact is >> there anyway. Note: I don't think this is necessarily a better idea, because >> it may lead to less clear errors, but it's worth putting in the alternatives >> section at least. >> >> Cheers, >> Ralf >>> >>> >>> Would be great to get some comments on that. >>> >>> [1] >>> https://github.com/numpy/numpy/blob/master/doc/neps/nep-0030-duck-array-protocol.rst >>> [2] https://github.com/numpy/numpy/pull/14170 >>> [3] https://numpy.org/neps/nep-0022-ndarray-duck-typing-overview.html >>> >>> Best, >>> Peter >>> _______________________________________________ >>> NumPy-Discussion mailing list >>> NumPy-Discussion@python.org >>> https://mail.python.org/mailman/listinfo/numpy-discussion >> >> _______________________________________________ >> NumPy-Discussion mailing list >> NumPy-Discussion@python.org >> https://mail.python.org/mailman/listinfo/numpy-discussion > > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@python.org > https://mail.python.org/mailman/listinfo/numpy-discussion _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion