From: Todd M. <jm...@st...> - 2003-11-07 22:25:12
|
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 > Num...@li... > https://lists.sourceforge.net/lists/listinfo/numpy-discussion -- Todd Miller Space Telescope Science Institute 3700 San Martin Drive Baltimore MD, 21030 (410) 338 - 4576 |