[pypy-commit] pypy default: copy for slices

fijal noreply at buildbot.pypy.org
Wed Nov 30 11:12:44 CET 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: 
Changeset: r50005:0f42372d5c50
Date: 2011-11-30 12:12 +0200
http://bitbucket.org/pypy/pypy/changeset/0f42372d5c50/

Log:	copy for slices

diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -1110,6 +1110,15 @@
     def debug_repr(self):
         return 'Slice(%s)' % self.parent.debug_repr()
 
+    def copy(self):
+        array = NDimArray(self.size, self.shape[:], self.parent.dtype,
+                          self.parent.order)
+        iter = self.start_iter()
+        while not iter.done():
+            array.setitem(iter.offset, self.getitem(iter.offset))
+            iter = iter.next(len(self.shape))
+        return array
+
 class NDimArray(BaseArray):
     """ A class representing contiguous array. We know that each iteration
     by say ufunc will increase the data index by one
diff --git a/pypy/module/micronumpy/test/test_numarray.py b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -760,6 +760,19 @@
         a[::-1] = a + a
         assert (a == [8, 6, 4, 2, 0]).all()
 
+    def test_debug_repr(self):
+        from numpypy import zeros, sin
+        a = zeros(1)
+        assert a.__debug_repr__() == 'Array'
+        assert (a + a).__debug_repr__() == 'Call2(add, Array, Array)'
+        assert (a[::2]).__debug_repr__() == 'Slice(Array)'
+        assert (a + 2).__debug_repr__() == 'Call2(add, Array, Scalar)'
+        assert (a + a.flat).__debug_repr__() == 'Call2(add, Array, FlatIter(Array))'
+        assert sin(a).__debug_repr__() == 'Call1(sin, Array)'
+        b = a + a
+        b[0] = 3
+        assert b.__debug_repr__() == 'Call2(add, forced=Array)'
+
 class AppTestMultiDim(BaseNumpyAppTest):
     def test_init(self):
         import numpypy
@@ -989,18 +1002,11 @@
         a = array([1, 2, 3])
         assert dot(a.flat, a.flat) == 14
 
-    def test_debug_repr(self):
-        from numpypy import zeros, sin
-        a = zeros(1)
-        assert a.__debug_repr__() == 'Array'
-        assert (a + a).__debug_repr__() == 'Call2(add, Array, Array)'
-        assert (a[::2]).__debug_repr__() == 'Slice(Array)'
-        assert (a + 2).__debug_repr__() == 'Call2(add, Array, Scalar)'
-        assert (a + a.flat).__debug_repr__() == 'Call2(add, Array, FlatIter(Array))'
-        assert sin(a).__debug_repr__() == 'Call1(sin, Array)'
-        b = a + a
-        b[0] = 3
-        assert b.__debug_repr__() == 'Call2(add, forced=Array)'
+    def test_slice_copy(self):
+        from numpypy import zeros
+        a = zeros((10, 10))
+        b = a[0].copy()
+        assert (b == zeros(10)).all()
 
 class AppTestSupport(object):
     def setup_class(cls):


More information about the pypy-commit mailing list