5
5
import numpy as np
6
6
import pytest
7
7
8
- from .. import ones , asarray , result_type , all , equal
8
+ from .. import ones , arange , reshape , asarray , result_type , all , equal
9
9
from .._array_object import Array , CPU_DEVICE , Device
10
10
from .._dtypes import (
11
11
_all_dtypes ,
@@ -45,35 +45,46 @@ def test_validate_index():
45
45
a = ones ((3 , 4 ))
46
46
47
47
# 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 ])
65
65
66
66
# 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 ])
70
70
assert_raises (IndexError , lambda : a [[True , True , True ]])
71
71
assert_raises (IndexError , lambda : a [(True , True , True ),])
72
72
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
77
88
assert_raises (IndexError , lambda : a [[0 , 1 ]])
78
89
assert_raises (IndexError , lambda : a [(0 , 1 ), (0 , 1 )])
79
90
assert_raises (IndexError , lambda : a [[0 , 1 ]])
@@ -87,6 +98,45 @@ def test_validate_index():
87
98
assert_raises (IndexError , lambda : a [0 ,])
88
99
assert_raises (IndexError , lambda : a [0 ])
89
100
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
+
90
140
91
141
def test_promoted_scalar_inherits_device ():
92
142
device1 = Device ("device1" )
0 commit comments