[pypy-commit] pypy indexing: Raise an error when indexing with 2 ellipses
rlamy
noreply at buildbot.pypy.org
Fri Jul 10 14:46:49 CEST 2015
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: indexing
Changeset: r78527:a0c21224679b
Date: 2015-07-10 13:46 +0100
http://bitbucket.org/pypy/pypy/changeset/a0c21224679b/
Log: Raise an error when indexing with 2 ellipses
diff --git a/pypy/module/micronumpy/concrete.py b/pypy/module/micronumpy/concrete.py
--- a/pypy/module/micronumpy/concrete.py
+++ b/pypy/module/micronumpy/concrete.py
@@ -9,7 +9,8 @@
from pypy.module.micronumpy.base import convert_to_array, W_NDimArray, \
ArrayArgumentException, W_NumpyObject
from pypy.module.micronumpy.iterators import ArrayIter
-from pypy.module.micronumpy.strides import (Chunk, Chunks, NewAxisChunk,
+from pypy.module.micronumpy.strides import (
+ Chunk, Chunks, NewAxisChunk, EllipsisChunk,
RecordChunk, calc_strides, calc_new_strides, shape_agreement,
calculate_broadcast_strides, calc_backstrides, calc_start, is_c_contiguous,
is_f_contiguous)
@@ -204,6 +205,8 @@
if (isinstance(w_item, W_NDimArray) or
space.isinstance_w(w_item, space.w_list)):
raise ArrayArgumentException
+ elif space.is_w(w_item, space.w_Ellipsis):
+ raise IndexError
return self._lookup_by_index(space, view_w)
if shape_len == 0:
raise oefmt(space.w_IndexError, "too many indices for array")
@@ -240,8 +243,17 @@
return Chunks([NewAxisChunk()])
result = []
i = 0
+ has_ellipsis = False
for w_item in space.fixedview(w_idx):
- if space.is_w(w_item, space.w_None):
+ if space.is_w(w_item, space.w_Ellipsis):
+ if has_ellipsis:
+ # in CNumPy, this is only a deprecation warning
+ raise oefmt(space.w_ValueError,
+ "an index can only have a single Ellipsis (`...`); "
+ "replace all but one with slices (`:`).")
+ result.append(EllipsisChunk())
+ has_ellipsis = True
+ elif space.is_w(w_item, space.w_None):
result.append(NewAxisChunk())
else:
result.append(Chunk(*space.decode_index4(w_item,
diff --git a/pypy/module/micronumpy/strides.py b/pypy/module/micronumpy/strides.py
--- a/pypy/module/micronumpy/strides.py
+++ b/pypy/module/micronumpy/strides.py
@@ -82,6 +82,10 @@
def __init__(self):
pass
+class EllipsisChunk(BaseChunk):
+ def __init__(self):
+ pass
+
class BaseTransform(object):
pass
diff --git a/pypy/module/micronumpy/test/test_ndarray.py b/pypy/module/micronumpy/test/test_ndarray.py
--- a/pypy/module/micronumpy/test/test_ndarray.py
+++ b/pypy/module/micronumpy/test/test_ndarray.py
@@ -2484,6 +2484,10 @@
assert b.shape == b[...].shape
assert (b == b[...]).all()
+ a = np.arange(6).reshape(2, 3)
+ if '__pypy__' in sys.builtin_module_names:
+ raises(ValueError, "a[..., ...]")
+
def test_empty_indexing(self):
import numpy as np
r = np.ones(3)
More information about the pypy-commit
mailing list