55import numpy as np
66import pytest
77
8- from .. import ones , asarray , result_type , all , equal
8+ from .. import ones , arange , reshape , asarray , result_type , all , equal
99from .._array_object import Array , CPU_DEVICE , Device
1010from .._dtypes import (
1111 _all_dtypes ,
@@ -45,35 +45,46 @@ def test_validate_index():
4545 a = ones ((3 , 4 ))
4646
4747 # Out of bounds slices are not allowed
48- assert_raises (IndexError , lambda : a [:4 ])
49- assert_raises (IndexError , lambda : a [:- 4 ])
50- assert_raises (IndexError , lambda : a [:3 :- 1 ])
51- assert_raises (IndexError , lambda : a [:- 5 :- 1 ])
52- assert_raises (IndexError , lambda : a [4 :])
53- assert_raises (IndexError , lambda : a [- 4 :])
54- assert_raises (IndexError , lambda : a [4 ::- 1 ])
55- assert_raises (IndexError , lambda : a [- 4 ::- 1 ])
56-
57- assert_raises (IndexError , lambda : a [...,:5 ])
58- assert_raises (IndexError , lambda : a [...,:- 5 ])
59- assert_raises (IndexError , lambda : a [...,:5 :- 1 ])
60- assert_raises (IndexError , lambda : a [...,:- 6 :- 1 ])
61- assert_raises (IndexError , lambda : a [...,5 :])
62- assert_raises (IndexError , lambda : a [...,- 5 :])
63- assert_raises (IndexError , lambda : a [...,5 ::- 1 ])
64- assert_raises (IndexError , lambda : a [...,- 5 ::- 1 ])
48+ assert_raises (IndexError , lambda : a [:4 , 0 ])
49+ assert_raises (IndexError , lambda : a [:- 4 , 0 ])
50+ assert_raises (IndexError , lambda : a [:3 :- 1 ]) # XXX raises for a wrong reason
51+ assert_raises (IndexError , lambda : a [:- 5 :- 1 , 0 ])
52+ assert_raises (IndexError , lambda : a [4 :, 0 ])
53+ assert_raises (IndexError , lambda : a [- 4 :, 0 ])
54+ assert_raises (IndexError , lambda : a [4 ::- 1 , 0 ])
55+ assert_raises (IndexError , lambda : a [- 4 ::- 1 , 0 ])
56+
57+ assert_raises (IndexError , lambda : a [..., :5 ])
58+ assert_raises (IndexError , lambda : a [..., :- 5 ])
59+ assert_raises (IndexError , lambda : a [..., :5 :- 1 ])
60+ assert_raises (IndexError , lambda : a [..., :- 6 :- 1 ])
61+ assert_raises (IndexError , lambda : a [..., 5 :])
62+ assert_raises (IndexError , lambda : a [..., - 5 :])
63+ assert_raises (IndexError , lambda : a [..., 5 ::- 1 ])
64+ assert_raises (IndexError , lambda : a [..., - 5 ::- 1 ])
6565
6666 # Boolean indices cannot be part of a larger tuple index
67- assert_raises (IndexError , lambda : a [a [:,0 ] == 1 , 0 ])
68- assert_raises (IndexError , lambda : a [a [:,0 ] == 1 , ...])
69- assert_raises (IndexError , lambda : a [..., a [0 ]== 1 ])
67+ assert_raises (IndexError , lambda : a [a [:, 0 ] == 1 , 0 ])
68+ assert_raises (IndexError , lambda : a [a [:, 0 ] == 1 , ...])
69+ assert_raises (IndexError , lambda : a [..., a [0 ] == 1 ])
7070 assert_raises (IndexError , lambda : a [[True , True , True ]])
7171 assert_raises (IndexError , lambda : a [(True , True , True ),])
7272
73- # Integer array indices are not allowed (except for 0-D)
74- idx = asarray ([[0 , 1 ]])
75- assert_raises (IndexError , lambda : a [idx ])
76- assert_raises (IndexError , lambda : a [idx ,])
73+ # Mixing 1D integer array indices with slices, ellipsis or booleans is not allowed
74+ idx = asarray ([0 , 1 ])
75+ assert_raises (IndexError , lambda : a [..., idx ])
76+ assert_raises (IndexError , lambda : a [:, idx ])
77+ assert_raises (IndexError , lambda : a [asarray ([True , True ]), idx ])
78+
79+ # 1D integer array indices must have the same length
80+ idx1 = asarray ([0 , 1 ])
81+ idx2 = asarray ([0 , 1 , 1 ])
82+ assert_raises (IndexError , lambda : a [idx1 , idx2 ])
83+
84+ # Non-integer array indices are not allowed
85+ assert_raises (IndexError , lambda : a [ones (2 ), 0 ])
86+
87+ # Array-likes (lists, tuples) are not allowed as indices
7788 assert_raises (IndexError , lambda : a [[0 , 1 ]])
7889 assert_raises (IndexError , lambda : a [(0 , 1 ), (0 , 1 )])
7990 assert_raises (IndexError , lambda : a [[0 , 1 ]])
@@ -87,6 +98,45 @@ def test_validate_index():
8798 assert_raises (IndexError , lambda : a [0 ,])
8899 assert_raises (IndexError , lambda : a [0 ])
89100 assert_raises (IndexError , lambda : a [:])
101+ assert_raises (IndexError , lambda : a [idx ])
102+
103+
104+ def test_indexing_arrays ():
105+ # indexing with 1D integer arrays and mixes of integers and 1D integer are allowed
106+
107+ # 1D array
108+ a = arange (5 )
109+ idx = asarray ([1 , 0 , 1 , 2 , - 1 ])
110+ a_idx = a [idx ]
111+
112+ a_idx_loop = asarray ([a [idx [i ]] for i in range (idx .shape [0 ])])
113+ assert all (a_idx == a_idx_loop )
114+
115+ # setitem with arrays is not allowed
116+ with assert_raises (IndexError ):
117+ a [idx ] = 42
118+
119+ # mixed array and integer indexing
120+ a = reshape (arange (3 * 4 ), (3 , 4 ))
121+ idx = asarray ([1 , 0 , 1 , 2 , - 1 ])
122+ a_idx = a [idx , 1 ]
123+
124+ a_idx_loop = asarray ([a [idx [i ], 1 ] for i in range (idx .shape [0 ])])
125+ assert all (a_idx == a_idx_loop )
126+
127+ # index with two arrays
128+ a_idx = a [idx , idx ]
129+ a_idx_loop = asarray ([a [idx [i ], idx [i ]] for i in range (idx .shape [0 ])])
130+ assert all (a_idx == a_idx_loop )
131+
132+ # setitem with arrays is not allowed
133+ with assert_raises (IndexError ):
134+ a [idx , idx ] = 42
135+
136+ # smoke test indexing with ndim > 1 arrays
137+ idx = idx [..., None ]
138+ a [idx , idx ]
139+
90140
91141def test_promoted_scalar_inherits_device ():
92142 device1 = Device ("device1" )
0 commit comments