It looks like general assignment function `array_assign_subscript` calls `PyArray_CopyObject(view, op)` link <https://github.com/numpy/numpy/blob/a07c6c5f12eec1322d2487f0ed935c5c13b8d883/numpy/_core/src/multiarray/mapping.c#L1938> which in turn always calls `PyArray_DiscoverDTypeAndShape` with `copy=1` and this is where `copy=True` takes place.
We could add a `copy` parameter to `PyArray_CopyObject` or set `copy=-1` (to `None`) for the `PyArray_DiscoverDTypeAndShape` call. Mateusz On Thu, Dec 26, 2024 at 10:19 AM Sebastian Berg <sebast...@sipsolutions.net> wrote: > That seems like a bug but not sure why it would happen. It needs to > call `__array__`, but indeed of course not with `copy=True`. > > Would you open an issue on github? > > - Sebastian > > > On Thu, 2024-12-26 at 03:46 +0000, Israel, Daniel M via NumPy- > Discussion wrote: > > Sure. I didn’t originally, because I thought it would require an > > entire custom array container, but the following trivial example > > actually shows the behavior in question: > > > > import numpy > > > > class MyThing(object): > > def __array__(self, dtype=None, copy=None): > > print(f"MyThing.__array__(dtype={dtype}, copy={copy})") > > return numpy.ones((5, 5)) > > > > u = numpy.zeros((5, 5)) > > v = MyThing() > > > > u[...] = v > > > > If you run this code, as part of the final assignment statement, the > > __array__ method is called for ‘v’ with copy=True. Why? > > > > — > > Daniel Israel > > XCP-4: Continuum Models and Numerical Algorithms > > d...@lanl.gov > > > > On Dec 25, 2024, at 3:23 PM, Steven Ellis > > <stevenalonzoel...@gmail.com> wrote: > > > > Hi David, > > > > New to the listserv, but, maybe you can provide a reproducible > > example? > > > > Steven > > > > On Wed, Dec 25, 2024, 2:19 PM Israel, Daniel M via NumPy-Discussion > > <numpy-discussion@python.org<mailto:numpy-discussion@python.org>> > > wrote: > > I was updating some code that uses a custom array container built > > with the mixin library. Specifically, I was trying to eliminate some > > warnings due to the change to the __array__ interface to add a copy > > argument. In doing so, I discovered that, for two objects u, v in my > > container class, the code: > > > > u[…] = v > > > > performs a copy on v. Specifically, it calls __array__() with > > copy=True. This seems unnecessary and wasteful of memory. Can > > someone explain to me what is happening here? > > > > Thanks. > > > > — > > Daniel Israel > > XCP-4: Continuum Models and Numerical Algorithms > > d...@lanl.gov<mailto:d...@lanl.gov> > > > > _______________________________________________ > > NumPy-Discussion mailing list -- > > numpy-discussion@python.org<mailto:numpy-discussion@python.org> > > To unsubscribe send an email to > > numpy-discussion-le...@python.org<mailto: > > numpy-discussion-le...@python.org> > > https://mail.python.org/mailman3/lists/numpy-discussion.python.org/< > > > https://urldefense.com/v3/__https://mail.python.org/mailman3/lists/numpy-discussion.python.org/__;!!Bt8fGhp8LhKGRg!A_N5Cns4800odNjjStN3QAH94TwUNBEkvr7lqW4-PnnUiGS_kckVyXKfS4QTR4YADAXXGOTbKZ-6RDYTC7knRCMj$ > > > > > Member address: > > stevenalonzoel...@gmail.com<mailto:stevenalonzoel...@gmail.com> > > > > _______________________________________________ > > NumPy-Discussion mailing list -- numpy-discussion@python.org > > To unsubscribe send an email to numpy-discussion-le...@python.org > > https://mail.python.org/mailman3/lists/numpy-discussion.python.org/ > > Member address: sebast...@sipsolutions.net > > _______________________________________________ > NumPy-Discussion mailing list -- numpy-discussion@python.org > To unsubscribe send an email to numpy-discussion-le...@python.org > https://mail.python.org/mailman3/lists/numpy-discussion.python.org/ > Member address: mso...@quansight.com >
_______________________________________________ NumPy-Discussion mailing list -- numpy-discussion@python.org To unsubscribe send an email to numpy-discussion-le...@python.org https://mail.python.org/mailman3/lists/numpy-discussion.python.org/ Member address: arch...@mail-archive.com