ndarray-slice

Build Documentation Downloads Version Rust License

Fast and robust slice-based algorithms (e.g., [sorting], [selection], [search]) for non-contiguous (sub)views into n-dimensional arrays. Reimplements algorithms in [slice] and [rayon::slice] for [ndarray] with arbitrary memory layout (e.g., non-contiguous).

Example

```rust use ndarray_slice::{ndarray::arr2, Slice1Ext};

// 2-dimensional array of 4 rows and 5 columns. let mut v = arr2(&[[-5, 4, 1, -3, 2], // row 0, axis 0 [ 8, 3, 2, 4, 8], // row 1, axis 0 [38, 9, 3, 0, 3], // row 2, axis 0 [ 4, 9, 0, 8, -1]]); // row 3, axis 0 // \ \ \ // column 0 \ column 4 axis 1 // column 2 axis 1

// Mutable subview into the last column. let mut column = v.column_mut(4);

// Due to row-major memory layout, columns are non-contiguous // and hence cannot be sorted by viewing them as mutable slices. asserteq!(column.asslice_mut(), None);

// Instead, sorting is specifically implemented for non-contiguous // mutable (sub)views. column.sort_unstable();

assert!(v == arr2(&[[-5, 4, 1, -3, -1], [ 8, 3, 2, 4, 2], [38, 9, 3, 0, 3], [ 4, 9, 0, 8, 8]])); // \ // column 4 sorted, others untouched ```

Current Implementation

Complexities where n is the length of the (sub)view and m the count of indices to select.

| Resource | Complexity | Sorting (stable) | Sorting (unstable) | Selection (unstable) | Bulk Selection (unstable) | |----------|------------|------------------|---------------------|--------------------------|---------------------------| | Time | Best | O(n) | O(n) | O(n) | O(n log m) | | Time | Expected | O(n log n) | O(n log n) | O(n) | O(n log m) | | Time | Worst | O(n log n) | O(n log n) | O(n log n) | O(n log n log m) | | Space | Best | O(1) | O(1) | O(1) | O(m) | | Space | Expected | O(n/2) | O(log n) | O(log n) | O(m+log n) | | Spoce | Worst | O(n/2) | O(log n) | O(log n) | O(m+log n) |

Roadmap

See the release history to keep track of the development.

Features

License

Copyright © 2023 Rouven Spreckels rs@qu1x.dev

This project is licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.