@@ -6,6 +6,7 @@ extern crate ndarray;
6
6
extern crate defmac;
7
7
extern crate itertools;
8
8
9
+ use ndarray:: { SliceInfo , SliceOrIndex } ;
9
10
use ndarray:: prelude:: * ;
10
11
use ndarray:: {
11
12
rcarr2,
@@ -66,6 +67,172 @@ fn test_slice()
66
67
assert ! ( vi. iter( ) . zip( A . iter( ) ) . all( |( a, b) | a == b) ) ;
67
68
}
68
69
70
+ #[ test]
71
+ fn test_slice_with_many_dim ( ) {
72
+ let mut A = RcArray :: < usize , _ > :: zeros ( & [ 3 , 1 , 4 , 1 , 3 , 2 , 1 ] [ ..] ) ;
73
+ for ( i, elt) in A . iter_mut ( ) . enumerate ( ) {
74
+ * elt = i;
75
+ }
76
+
77
+ let vi = A . slice ( s ! [ ..2 , .., ..; 2 , ..1 , ..1 , 1 .., ..] ) ;
78
+ let new_shape = & [ 2 , 1 , 2 , 1 , 1 , 1 , 1 ] [ ..] ;
79
+ assert_eq ! ( vi. shape( ) , new_shape) ;
80
+ let correct = array ! [
81
+ [ A [ & [ 0 , 0 , 0 , 0 , 0 , 1 , 0 ] [ ..] ] , A [ & [ 0 , 0 , 2 , 0 , 0 , 1 , 0 ] [ ..] ] ] ,
82
+ [ A [ & [ 1 , 0 , 0 , 0 , 0 , 1 , 0 ] [ ..] ] , A [ & [ 1 , 0 , 2 , 0 , 0 , 1 , 0 ] [ ..] ] ]
83
+ ] . into_shape ( new_shape)
84
+ . unwrap ( ) ;
85
+ assert_eq ! ( vi, correct) ;
86
+
87
+ let vi = A . slice ( s ! [ ..2 , 0 , ..; 2 , 0 , 0 , 1 , 0 ] ) ;
88
+ assert_eq ! ( vi. shape( ) , & [ 2 , 2 ] [ ..] ) ;
89
+ let correct = array ! [
90
+ [ A [ & [ 0 , 0 , 0 , 0 , 0 , 1 , 0 ] [ ..] ] , A [ & [ 0 , 0 , 2 , 0 , 0 , 1 , 0 ] [ ..] ] ] ,
91
+ [ A [ & [ 1 , 0 , 0 , 0 , 0 , 1 , 0 ] [ ..] ] , A [ & [ 1 , 0 , 2 , 0 , 0 , 1 , 0 ] [ ..] ] ]
92
+ ] ;
93
+ assert_eq ! ( vi, correct) ;
94
+ }
95
+
96
+ #[ test]
97
+ fn test_slice_array_fixed ( ) {
98
+ let mut arr = Array3 :: < f64 > :: zeros ( ( 5 , 2 , 5 ) ) ;
99
+ let info = s ! [ 1 .., 1 , ..; 2 ] ;
100
+ arr. slice ( info) ;
101
+ arr. slice_mut ( info) ;
102
+ arr. view ( ) . slice_move ( info) ;
103
+ arr. view ( ) . slice_inplace ( info) ;
104
+ }
105
+
106
+ #[ test]
107
+ fn test_slice_dyninput_array_fixed ( ) {
108
+ let mut arr = Array3 :: < f64 > :: zeros ( ( 5 , 2 , 5 ) ) . into_dyn ( ) ;
109
+ let info = s ! [ 1 .., 1 , ..; 2 ] ;
110
+ arr. slice ( info) ;
111
+ arr. slice_mut ( info) ;
112
+ arr. view ( ) . slice_move ( info) ;
113
+ arr. view ( ) . slice_inplace ( info. as_ref ( ) ) ;
114
+ }
115
+
116
+ #[ test]
117
+ fn test_slice_array_dyn ( ) {
118
+ let mut arr = Array3 :: < f64 > :: zeros ( ( 5 , 2 , 5 ) ) ;
119
+ let info = & SliceInfo :: < _ , IxDyn > :: new ( [
120
+ SliceOrIndex :: from ( 1 ..) ,
121
+ SliceOrIndex :: from ( 1 ) ,
122
+ SliceOrIndex :: from ( ..) . step ( 2 ) ,
123
+ ] ) ;
124
+ arr. slice ( info) ;
125
+ arr. slice_mut ( info) ;
126
+ arr. view ( ) . slice_move ( info) ;
127
+ arr. view ( ) . slice_inplace ( info) ;
128
+ }
129
+
130
+ #[ test]
131
+ fn test_slice_dyninput_array_dyn ( ) {
132
+ let mut arr = Array3 :: < f64 > :: zeros ( ( 5 , 2 , 5 ) ) . into_dyn ( ) ;
133
+ let info = & SliceInfo :: < _ , IxDyn > :: new ( [
134
+ SliceOrIndex :: from ( 1 ..) ,
135
+ SliceOrIndex :: from ( 1 ) ,
136
+ SliceOrIndex :: from ( ..) . step ( 2 ) ,
137
+ ] ) ;
138
+ arr. slice ( info) ;
139
+ arr. slice_mut ( info) ;
140
+ arr. view ( ) . slice_move ( info) ;
141
+ arr. view ( ) . slice_inplace ( info. as_ref ( ) ) ;
142
+ }
143
+
144
+ #[ test]
145
+ fn test_slice_dyninput_vec_fixed ( ) {
146
+ let mut arr = Array3 :: < f64 > :: zeros ( ( 5 , 2 , 5 ) ) . into_dyn ( ) ;
147
+ let info = & SliceInfo :: < _ , Ix2 > :: new ( vec ! [
148
+ SliceOrIndex :: from( 1 ..) ,
149
+ SliceOrIndex :: from( 1 ) ,
150
+ SliceOrIndex :: from( ..) . step( 2 ) ,
151
+ ] ) ;
152
+ arr. slice ( info. as_ref ( ) ) ;
153
+ arr. slice_mut ( info. as_ref ( ) ) ;
154
+ arr. view ( ) . slice_move ( info. as_ref ( ) ) ;
155
+ arr. view ( ) . slice_inplace ( info. as_ref ( ) ) ;
156
+ }
157
+
158
+ #[ test]
159
+ fn test_slice_dyninput_vec_dyn ( ) {
160
+ let mut arr = Array3 :: < f64 > :: zeros ( ( 5 , 2 , 5 ) ) . into_dyn ( ) ;
161
+ let info = & SliceInfo :: < _ , IxDyn > :: new ( vec ! [
162
+ SliceOrIndex :: from( 1 ..) ,
163
+ SliceOrIndex :: from( 1 ) ,
164
+ SliceOrIndex :: from( ..) . step( 2 ) ,
165
+ ] ) ;
166
+ arr. slice ( info. as_ref ( ) ) ;
167
+ arr. slice_mut ( info. as_ref ( ) ) ;
168
+ arr. view ( ) . slice_move ( info. as_ref ( ) ) ;
169
+ arr. view ( ) . slice_inplace ( info. as_ref ( ) ) ;
170
+ }
171
+
172
+ #[ test]
173
+ fn test_slice_with_subview ( ) {
174
+ let mut arr = RcArray :: < usize , _ > :: zeros ( ( 3 , 5 , 4 ) ) ;
175
+ for ( i, elt) in arr. iter_mut ( ) . enumerate ( ) {
176
+ * elt = i;
177
+ }
178
+
179
+ let vi = arr. slice ( s ! [ 1 .., 2 , ..; 2 ] ) ;
180
+ assert_eq ! ( vi. shape( ) , & [ 2 , 2 ] ) ;
181
+ assert ! (
182
+ vi. iter( )
183
+ . zip( arr. subview( Axis ( 1 ) , 2 ) . slice( s![ 1 .., ..; 2 ] ) . iter( ) )
184
+ . all( |( a, b) | a == b)
185
+ ) ;
186
+
187
+ let vi = arr. slice ( s ! [ 1 , 2 , ..; 2 ] ) ;
188
+ assert_eq ! ( vi. shape( ) , & [ 2 ] ) ;
189
+ assert ! (
190
+ vi. iter( )
191
+ . zip(
192
+ arr. subview( Axis ( 0 ) , 1 )
193
+ . subview( Axis ( 0 ) , 2 )
194
+ . slice( s![ ..; 2 ] )
195
+ . iter( )
196
+ )
197
+ . all( |( a, b) | a == b)
198
+ ) ;
199
+
200
+ let vi = arr. slice ( s ! [ 1 , 2 , 3 ] ) ;
201
+ assert_eq ! ( vi. shape( ) , & [ ] ) ;
202
+ assert_eq ! ( vi, Array0 :: from_elem( ( ) , arr[ ( 1 , 2 , 3 ) ] ) ) ;
203
+ }
204
+
205
+ #[ test]
206
+ fn test_slice_inplace_with_subview_inplace ( ) {
207
+ let mut arr = RcArray :: < usize , _ > :: zeros ( ( 3 , 5 , 4 ) ) ;
208
+ for ( i, elt) in arr. iter_mut ( ) . enumerate ( ) {
209
+ * elt = i;
210
+ }
211
+
212
+ let mut vi = arr. view ( ) ;
213
+ vi. slice_inplace ( s ! [ 1 .., 2 , ..; 2 ] ) ;
214
+ assert_eq ! ( vi. shape( ) , & [ 2 , 1 , 2 ] ) ;
215
+ assert ! (
216
+ vi. iter( )
217
+ . zip( arr. slice( s![ 1 .., 2 ..3 , ..; 2 ] ) . iter( ) )
218
+ . all( |( a, b) | a == b)
219
+ ) ;
220
+
221
+ let mut vi = arr. view ( ) ;
222
+ vi. slice_inplace ( s ! [ 1 , 2 , ..; 2 ] ) ;
223
+ assert_eq ! ( vi. shape( ) , & [ 1 , 1 , 2 ] ) ;
224
+ assert ! (
225
+ vi. iter( )
226
+ . zip( arr. slice( s![ 1 ..2 , 2 ..3 , ..; 2 ] ) . iter( ) )
227
+ . all( |( a, b) | a == b)
228
+ ) ;
229
+
230
+ let mut vi = arr. view ( ) ;
231
+ vi. slice_inplace ( s ! [ 1 , 2 , 3 ] ) ;
232
+ assert_eq ! ( vi. shape( ) , & [ 1 , 1 , 1 ] ) ;
233
+ assert_eq ! ( vi, Array3 :: from_elem( ( 1 , 1 , 1 ) , arr[ ( 1 , 2 , 3 ) ] ) ) ;
234
+ }
235
+
69
236
#[ should_panic]
70
237
#[ test]
71
238
fn index_out_of_bounds ( ) {
0 commit comments