[Numpy-discussion] numarray __copy__ and __deepcopy__
Todd Miller
jmiller at stsci.edu
Fri Nov 7 14:26:02 EST 2003
Even though we haven't noticed this yet, it's nice to have standard
stuff work. I added your code as-is to numarray.generic. Thanks for
the info.
Best Regards,
Todd
On Fri, 2003-11-07 at 17:06, Tim Hochberg wrote:
> Fernando Perez wrote:
>
> > Tim Hochberg wrote:
> >
> >> It appears that numarray.NumArray does not supply __copy__ or
> >> __deepcopy__ methods and as a result copy.copy and copy.deepcopy do
> >> not work correctly. It appears that adding "__copy__ = copy" to class
> >> NumArray is suffcient for copy, __deepcopy__ appears to need
> >> something more. Sadly, I don't have time to investigate this further
> >> right now.
> >
> >
> > As far as I understand, this isn't really necessary with
> > Numeric/Numarray, because the copy() method in a sense always
> > guarantees a 'deep copy'. Even when you make assignments to slices of
> > an array, the issue of nested structures which for python lists/dicts
> > requires deepcopy() just does not arise. A simple illustration:
>
> Your correct that anArray.copy() provides a deep copy of an array in
> both Numeric and numarray. However, you would like to be able to pass
> some object to copy.copy or copy.deepcopy and have it provide the
> appropriate type of copy whether the given object is an array, list or
> something other. I believe that in Numeric, copy.copy and copy.deepcopy
> do the right thing already. However, in numarray::
>
> >>> import copy, numarray as na
> >>> a = na.arange(3)
> >>> a
> array([0, 1, 2])
> >>> b = copy.copy(a)
> >>> b[1] = 99
> >>> a
> array([ 0, 99, 2]) # Urkh!
>
> If you apply the fix I posted above that fixes copy.copy, but
> copy.deepcopy then fails. A full fix appears to be to add::
> *
> def __copy__(self):
> return self.copy()
> def __deepcopy__(self, memo):
> return self.copy()
>
> to Numarray. Then we get the desired behaviour:
>
> *>>> import copy, numarray as na
> >>> a = na.arange(3)
> >>> b = copy.copy(a)
> >>> c = copy.deepcopy(a)
> >>> a[0] = 99
> >>> a, b, c
> (array([99, 1, 2]), array([0, 1, 2]), array([0, 1, 2]))
>
> It may be possible to get the same effect by tweaking __getstate__ and
> __setstate__, since they also can be used to control copying, but I'm
> not familar with those functions.
>
> Regards,
>
> -tim
>
> >
> >
> > In [1]: a=arange(10)
> >
> > In [2]: b=arange(10,20)
> >
> > In [3]: c=arange(20,30)
> >
> > In [4]: d=zeros(30)
> >
> > In [5]: d[0:10] = a
> >
> > In [6]: d[10:20] = b
> >
> > In [7]: d[20:30] = c
> >
> > In [8]: a
> > Out[8]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
> >
> > In [9]: b
> > Out[9]: array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
> >
> > In [10]: c
> > Out[10]: array([20, 21, 22, 23, 24, 25, 26, 27, 28, 29])
> >
> > In [11]: d
> > Out[11]:
> > array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
> > 16, 17, 18,
> > 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29])
> >
> > In [12]: b[:]=99
> >
> > In [13]: b
> > Out[13]: array([99, 99, 99, 99, 99, 99, 99, 99, 99, 99])
> >
> > In [14]: d
> > Out[14]:
> > array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
> > 16, 17, 18,
> > 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29])
> >
> >
> > Perhaps I'm missing some usage case, but I've always just used
> > ARR.copy() when I've needed a 'full copy' of an array. This
> > guarantees that the returned array is contiguous (has .flat) and a
> > standalone copy of the data in ARR, regardless of the contiguity
> > properties of ARR.
> >
> > HTH.
> >
> > Cheers,
> >
> > f
> >
> > ps: my experience is actually from Numeric, I don't know if Numarray
> > differs in its copy() behavior.
> >
> >
>
>
>
>
>
> -------------------------------------------------------
> This SF.Net email sponsored by: ApacheCon 2003,
> 16-19 November in Las Vegas. Learn firsthand the latest
> developments in Apache, PHP, Perl, XML, Java, MySQL,
> WebDAV, and more! http://www.apachecon.com/
> _______________________________________________
> Numpy-discussion mailing list
> Numpy-discussion at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/numpy-discussion
--
Todd Miller
Space Telescope Science Institute
3700 San Martin Drive
Baltimore MD, 21030
(410) 338 - 4576
More information about the NumPy-Discussion
mailing list