Skip to content

Commit 047e79f

Browse files
committed
Add more tests for slicing
1 parent 4a778d4 commit 047e79f

File tree

1 file changed

+167
-0
lines changed

1 file changed

+167
-0
lines changed

tests/array.rs

+167
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ extern crate ndarray;
66
extern crate defmac;
77
extern crate itertools;
88

9+
use ndarray::{SliceInfo, SliceOrIndex};
910
use ndarray::prelude::*;
1011
use ndarray::{
1112
rcarr2,
@@ -66,6 +67,172 @@ fn test_slice()
6667
assert!(vi.iter().zip(A.iter()).all(|(a, b)| a == b));
6768
}
6869

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+
69236
#[should_panic]
70237
#[test]
71238
fn index_out_of_bounds() {

0 commit comments

Comments
 (0)