[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