ndarray-ndimage 0.2.0

Multidimensional image processing for ArrayBase, the n-dimensional array data structure provided by ndarray.
Documentation
use std::time::Instant;

use ndarray::{Array1, Array3, ShapeBuilder};

use ndarray_ndimage::{pad, PadMode};

fn main() {
    println!("C order");
    let data_c = (0..200 * 200 * 200)
        .map(|v| v as u32)
        .collect::<Array1<_>>()
        .into_shape((200, 200, 200))
        .unwrap();
    test(&data_c);

    println!("\nF order");
    let mut data_f = Array3::zeros((200, 200, 200).f());
    data_f.assign(&data_c);
    test(&data_f);
}

fn test(data: &Array3<u32>) {
    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Constant(0));
    let elapsed = now.elapsed();
    println!(
        "Constant 0  {}s {}ms  {}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded[(0, 0, 0)]
    );

    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Constant(1));
    let elapsed = now.elapsed();
    println!(
        "Constant 1  {}s {}ms  {}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded[(0, 0, 0)]
    );

    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Edge);
    let elapsed = now.elapsed();
    println!(
        "Edge        {}s {}ms  {:?}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded.dim()
    );

    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Maximum);
    let elapsed = now.elapsed();
    println!(
        "Maximum     {}s {}ms  {:?}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded.dim()
    );

    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Mean);
    let elapsed = now.elapsed();
    println!(
        "Mean        {}s {}ms  {:?}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded.dim()
    );

    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Median);
    let elapsed = now.elapsed();
    println!(
        "Median      {}s {}ms  {:?}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded.dim()
    );

    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Minimum);
    let elapsed = now.elapsed();
    println!(
        "Minimum     {}s {}ms  {:?}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded.dim()
    );

    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Reflect);
    let elapsed = now.elapsed();
    println!(
        "Reflect     {}s {}ms  {:?}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded.dim()
    );

    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Symmetric);
    let elapsed = now.elapsed();
    println!(
        "Symmetric   {}s {}ms  {:?}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded.dim()
    );

    let now = Instant::now();
    let padded = pad(&data, &[(1, 1)], PadMode::Wrap);
    let elapsed = now.elapsed();
    println!(
        "Wrap        {}s {}ms  {:?}",
        elapsed.as_secs(),
        elapsed.subsec_millis(),
        padded.dim()
    );
}