[pypy-commit] pypy numpy-refactor: one dim view iterator

fijal noreply at buildbot.pypy.org
Thu Aug 30 20:24:48 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: numpy-refactor
Changeset: r57030:865073412c1f
Date: 2012-08-30 20:16 +0200
http://bitbucket.org/pypy/pypy/changeset/865073412c1f/

Log:	one dim view iterator

diff --git a/pypy/module/micronumpy/arrayimpl/concrete.py b/pypy/module/micronumpy/arrayimpl/concrete.py
--- a/pypy/module/micronumpy/arrayimpl/concrete.py
+++ b/pypy/module/micronumpy/arrayimpl/concrete.py
@@ -11,7 +11,7 @@
         self.array = array
         self.offset = 0
         self.dtype = array.dtype
-        self.element_size = array.dtype.get_size()
+        self.skip = self.dtype.itemtype.get_element_size()
         self.size = array.size
 
     def setitem(self, elem):
@@ -21,11 +21,34 @@
         return self.array.getitem(self.offset)
 
     def next(self):
-        self.offset += self.element_size
+        self.offset += self.skip
 
     def done(self):
         return self.offset >= self.size
 
+class OneDimViewIterator(base.BaseArrayIterator):
+    def __init__(self, array):
+        self.array = array
+        self.offset = array.start
+        self.skip = array.strides[0]
+        self.dtype = array.dtype
+        self.index = 0
+        self.size = array.shape[0]
+
+    def setitem(self, elem):
+        self.array.setitem(self.offset, elem)
+
+    def getitem(self):
+        return self.array.getitem(self.offset)
+
+    def next(self):
+        self.offset += self.skip
+        self.index += 1
+
+    def done(self):
+        return self.index >= self.size
+
+
 def calc_strides(shape, dtype, order):
     strides = []
     backstrides = []
@@ -82,6 +105,8 @@
         return loop.setslice(impl, self)
 
     def setslice(self, arr):
+        if arr.storage == self.storage:
+            arr = arr.copy()
         loop.setslice(self, arr)
 
     def get_size(self):
@@ -214,3 +239,11 @@
         self.dtype = parent.dtype
         self.size = support.product(shape) * self.dtype.itemtype.get_element_size()
         self.start = start
+
+    def fill(self, box):
+        xxx
+
+    def create_iter(self):
+        if len(self.shape) == 1:
+            return OneDimViewIterator(self)
+        xxx
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
@@ -63,7 +63,10 @@
         if (isinstance(w_idx, W_NDimArray) and w_idx.get_shape() == self.get_shape() and
             w_idx.get_dtype().is_bool_type()):
             return self.getitem_filter(space, w_idx)
-        return self.implementation.descr_getitem(space, w_idx)
+        try:
+            return self.implementation.descr_getitem(space, w_idx)
+        except OperationError:
+            raise OperationError(space.w_IndexError, space.wrap("wrong index"))
 
     def descr_setitem(self, space, w_idx, w_value):
         if (isinstance(w_idx, W_NDimArray) and w_idx.shape == self.shape and


More information about the pypy-commit mailing list