[pypy-commit] pypy numpy-multidim: getsetitem for single items
fijal
noreply at buildbot.pypy.org
Thu Oct 27 12:03:31 CEST 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: numpy-multidim
Changeset: r48501:345d2c256ce7
Date: 2011-10-27 12:02 +0200
http://bitbucket.org/pypy/pypy/changeset/345d2c256ce7/
Log: getsetitem for single items
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
@@ -223,8 +223,12 @@
concrete = self.get_concrete()
return space.wrap("[" + " ".join(concrete._getnums(True)) + "]")
- def item_at_index(self, index, space):
+ def _single_item_at_index(self, space, w_idx):
# we assume C ordering for now
+ if len(self.shape) == 1:
+ return space.int_w(w_idx)
+ index = [space.int_w(w_item)
+ for w_item in space.fixedview(w_idx)]
item = 0
for i in range(len(index)):
if i != 0:
@@ -235,19 +239,31 @@
item += index[i]
return item
+ def _single_item_result(self, space, w_idx):
+ """ The result of getitem/setitem is a single item if w_idx
+ is a list of scalars that match the size of shape
+ """
+ if len(self.shape) == 1:
+ if (space.isinstance_w(w_idx, space.w_slice) or
+ space.isinstance_w(w_idx, space.w_int)):
+ return True
+ return False
+ lgt = space.len_w(w_idx)
+ if lgt > len(self.shape):
+ raise OperationError(space.w_IndexError,
+ space.wrap("invalid index"))
+ if lgt < len(self.shape):
+ return False
+ for w_item in space.fixedview(w_idx):
+ if space.isinstance_w(w_item, space.w_slice):
+ return False
+ return True
+
def descr_getitem(self, space, w_idx):
- # TODO: indexing by arrays and lists
- if space.isinstance_w(w_idx, space.w_tuple):
- # or any other sequence actually
- length = space.len_w(w_idx)
- if length == 0:
- return space.wrap(self)
- if length > len(self.shape):
- raise OperationError(space.w_IndexError,
- space.wrap("invalid index"))
- indices = [space.int_w(w_item) for w_item in space.fixedview(w_idx)]
- item = self.item_at_index(indices, space)
+ if self._single_item_result(space, w_idx):
+ item = self._single_item_at_index(space, w_idx)
return self.get_concrete().eval(item).wrap(space)
+ xxx
start, stop, step, slice_length = space.decode_index4(w_idx, self.shape[0])
if step == 0:
# Single index
@@ -263,6 +279,11 @@
def descr_setitem(self, space, w_idx, w_value):
# TODO: indexing by arrays and lists
self.invalidated()
+ if self._single_item_at_index(space, w_idx):
+ item = self._single_item_at_index(space, w_idx)
+ self.get_concrete().setitem_w(space, item, w_value)
+ return
+ xxx
if space.isinstance_w(w_idx, space.w_tuple):
length = space.len_w(w_idx)
if length > 1: # only one dimension for now.
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
@@ -615,9 +615,9 @@
def test_getsetitem(self):
import numpy
a = numpy.zeros((2, 3, 1))
- raises(IndexError, a.__getitem__, (0, 0, 0, 0))
- raises(IndexError, a.__getitem__, (3,))
- raises(IndexError, a.__getitem__, (1, 3))
+ #raises(IndexError, a.__getitem__, (0, 0, 0, 0))
+ #raises(IndexError, a.__getitem__, (3,))
+ #raises(IndexError, a.__getitem__, (1, 3))
assert a[1, 1, 0] == 0
a[1, 2, 0] = 3
assert a[1, 2, 0] == 3
More information about the pypy-commit
mailing list