Author: Brian Kearns <bdkea...@gmail.com> Branch: Changeset: r68219:f5dbd427526c Date: 2013-11-18 14:41 -0500 http://bitbucket.org/pypy/pypy/changeset/f5dbd427526c/
Log: fix indexing using array scalars 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 @@ -211,7 +211,15 @@ "field named %s not found" % idx)) return RecordChunk(idx) if (space.isinstance_w(w_idx, space.w_int) or - space.isinstance_w(w_idx, space.w_slice)): + space.isinstance_w(w_idx, space.w_slice)): + return Chunks([Chunk(*space.decode_index4(w_idx, self.get_shape()[0]))]) + elif isinstance(w_idx, W_NDimArray) and \ + isinstance(w_idx.implementation, scalar.Scalar): + w_idx = w_idx.get_scalar_value().item(space) + if not space.isinstance_w(w_idx, space.w_int) and \ + not space.isinstance_w(w_idx, space.w_bool): + raise OperationError(space.w_IndexError, space.wrap( + "arrays used as indices must be of integer (or boolean) type")) return Chunks([Chunk(*space.decode_index4(w_idx, self.get_shape()[0]))]) elif space.is_w(w_idx, space.w_None): return Chunks([NewAxisChunk()]) 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 @@ -198,7 +198,8 @@ prefix) def descr_getitem(self, space, w_idx): - if isinstance(w_idx, W_NDimArray) and w_idx.get_dtype().is_bool_type(): + if isinstance(w_idx, W_NDimArray) and w_idx.get_dtype().is_bool_type() \ + and len(w_idx.get_shape()) > 0: return self.getitem_filter(space, w_idx) try: return self.implementation.descr_getitem(space, self, w_idx) 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 @@ -1862,12 +1862,16 @@ raises(IndexError, "arange(10)[array([10])] = 3") raises(IndexError, "arange(10)[[-11]] = 3") - def test_bool_single_index(self): + def test_array_scalar_index(self): import numpypy as np a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) - a[np.array(True)]; skip("broken") # check for crash but skip rest of test until correct + assert (a[np.array(0)] == a[0]).all() + assert (a[np.array(1)] == a[1]).all() + exc = raises(IndexError, "a[np.array(1.1)]") + assert exc.value.message == 'arrays used as indices must be of ' \ + 'integer (or boolean) type' assert (a[np.array(True)] == a[1]).all() assert (a[np.array(False)] == a[0]).all() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit