[pypy-commit] pypy numpy-multidim: tentative checkin
fijal
noreply at buildbot.pypy.org
Thu Oct 27 10:25:10 CEST 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: numpy-multidim
Changeset: r48492:4dd7d695536a
Date: 2011-10-27 00:04 +0200
http://bitbucket.org/pypy/pypy/changeset/4dd7d695536a/
Log: tentative checkin
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,17 +223,32 @@
concrete = self.get_concrete()
return space.wrap("[" + " ".join(concrete._getnums(True)) + "]")
+ def item_at_index(self, index, space):
+ # we assume C ordering for now
+ item = 0
+ for i in range(len(index)):
+ if i != 0:
+ item *= self.shape[i]
+ if index[i] >= self.shape[i]:
+ raise OperationError(space.w_IndexError,
+ space.wrap("index (%d) out of range (0<=index<%d" % (index[i], self.shape[i])))
+ item += index[i]
+ return item
+
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 > 1: # only one dimension for now.
+ if length > len(self.shape):
raise OperationError(space.w_IndexError,
space.wrap("invalid index"))
- w_idx = space.getitem(w_idx, space.wrap(0))
- start, stop, step, slice_length = space.decode_index4(w_idx, self.find_size())
+ indices = [space.int_w(w_item) for w_item in space.fixedview(w_idx)]
+ item = self.item_at_index(indices, space)
+ return self.get_concrete().eval(item).wrap(space)
+ start, stop, step, slice_length = space.decode_index4(w_idx, self.shape[0])
if step == 0:
# Single index
return self.get_concrete().eval(start).wrap(space)
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
@@ -611,7 +611,17 @@
assert numpy.zeros((2, 2)).shape == (2,2)
assert numpy.zeros((3, 1, 2)).shape == (3, 1, 2)
assert len(numpy.zeros((3, 1, 2))) == 3
-
+
+ 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))
+ assert a[1, 1, 0] == 0
+ a[1, 2, 0] = 3
+ assert a[1, 2, 0] == 3
+ assert a[1, 1, 0] == 0
class AppTestSupport(object):
def setup_class(cls):
More information about the pypy-commit
mailing list