File: iterator_chunks.rs

package info (click to toggle)
rust-ndarray 0.16.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,028 kB
  • sloc: sh: 30; makefile: 2
file content (104 lines) | stat: -rw-r--r-- 2,692 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#![allow(
    clippy::many_single_char_names, clippy::deref_addrof, clippy::unreadable_literal, clippy::many_single_char_names,
    clippy::float_cmp
)]

use ndarray::prelude::*;

#[test]
#[cfg(feature = "std")]
fn chunks()
{
    use ndarray::NdProducer;
    let a = <Array1<f32>>::linspace(1., 100., 10 * 10)
        .into_shape_with_order((10, 10))
        .unwrap();

    let (m, n) = a.dim();
    for i in 1..=m {
        for j in 1..=n {
            let c = a.exact_chunks((i, j));

            let ly = n / j;
            for (index, elt) in c.into_iter().enumerate() {
                assert_eq!(elt.dim(), (i, j));
                let cindex = (index / ly, index % ly);
                let cx = (cindex.0 * i) as isize;
                let cy = (cindex.1 * j) as isize;
                assert_eq!(
                    elt,
                    a.slice(s![cx.., cy..])
                        .slice(s![..i as isize, ..j as isize])
                );
            }
            let c = a.exact_chunks((i, j));
            assert_eq!(c.into_iter().count(), (m / i) * (n / j));

            let c = a.exact_chunks((i, j));
            let (c1, c2) = c.split_at(Axis(0), (m / i) / 2);
            assert_eq!(c1.into_iter().count(), ((m / i) / 2) * (n / j));
            assert_eq!(c2.into_iter().count(), (m / i - (m / i) / 2) * (n / j));
        }
    }
    let c = a.exact_chunks((m + 1, n));
    assert_eq!(c.raw_dim().size(), 0);
    assert_eq!(c.into_iter().count(), 0);
}

#[should_panic]
#[test]
fn chunks_different_size_1()
{
    let a = Array::<f32, _>::zeros(vec![2, 3]);
    a.exact_chunks(vec![2]);
}

#[test]
fn chunks_ok_size()
{
    let mut a = Array::<f32, _>::zeros(vec![2, 3]);
    a.fill(1.);
    let mut c = 0;
    for elt in a.exact_chunks(vec![2, 1]) {
        assert!(elt.iter().all(|&x| x == 1.));
        assert_eq!(elt.shape(), &[2, 1]);
        c += 1;
    }
    assert_eq!(c, 3);
}

#[should_panic]
#[test]
fn chunks_different_size_2()
{
    let a = Array::<f32, _>::zeros(vec![2, 3]);
    a.exact_chunks(vec![2, 3, 4]);
}

#[test]
fn chunks_mut()
{
    let mut a = Array::zeros((7, 8));
    for (i, mut chunk) in a.exact_chunks_mut((2, 3)).into_iter().enumerate() {
        chunk.fill(i);
    }
    println!("{:?}", a);
    let ans = array![
        [0, 0, 0, 1, 1, 1, 0, 0],
        [0, 0, 0, 1, 1, 1, 0, 0],
        [2, 2, 2, 3, 3, 3, 0, 0],
        [2, 2, 2, 3, 3, 3, 0, 0],
        [4, 4, 4, 5, 5, 5, 0, 0],
        [4, 4, 4, 5, 5, 5, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0]
    ];
    assert_eq!(a, ans);
}

#[should_panic]
#[test]
fn chunks_different_size_3()
{
    let mut a = Array::<f32, _>::zeros(vec![2, 3]);
    a.exact_chunks_mut(vec![2, 3, 4]);
}