#排序 #数组 #多维数组 #ndarray #numpy #内存布局

无 std ndarray-slice

针对非连续(子)视图的 n 维数组的高效且健壮的基于切片的算法(例如,排序、选择、搜索)

9 个版本

0.3.1 2024 年 6 月 13 日
0.3.0 2024 年 3 月 19 日
0.2.4 2024 年 1 月 23 日
0.2.3 2023 年 5 月 28 日
0.1.1 2023 年 4 月 7 日

#86算法

Download history 5/week @ 2024-05-19 157/week @ 2024-06-09 80/week @ 2024-06-16 130/week @ 2024-06-23 163/week @ 2024-06-30 125/week @ 2024-07-07 163/week @ 2024-07-14 191/week @ 2024-07-21 174/week @ 2024-07-28 126/week @ 2024-08-04 198/week @ 2024-08-11

每月 696 次下载
用于 2 crates

MIT/Apache

240KB
3.5K SLoC

ndarray-slice

Build Documentation Downloads Version Rust License

针对非连续(子)视图的 n 维数组的高效且健壮的基于切片的算法(例如,排序选择搜索)。在 slicerayon::slice 中重新实现算法,用于 ndarray,具有任意内存布局(例如,非连续)。

示例

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.
assert_eq!(column.as_slice_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

当前实现

当 n 是(子)视图的长度,m 是要选择索引的数量时,复杂度。

资源 复杂度 排序(稳定) 排序(不稳定) 选择(不稳定) 批量选择(不稳定)
时间 最好 O(n) O(n) O(n) O(n log m)
时间 平均 O(n log n) O(n log n) O(n) O(n log m)
时间 最坏 O(n log n) O(n log n) O(n) O(n log m)
空间 最好 O(1) O(1) O(1) O(m)
空间 平均 O(n/2) O(log n) O(1) O(m+log m)
空间 最坏 O(n/2) O(log n) O(1) O(m+log m)

路线图

  • 添加 SliceExt trait 以用于 n 维数组或(子)视图,其中方法期望 Axis 作为其第一个参数。比较方法将以 _by_by_key 后缀始终附加,定义如何比较沿提供的关注轴(例如,列)的多维元素(例如,行)。

查看 发布历史 以跟踪开发情况。

特性

  • alloc 用于稳定的 sort/sort_by/sort_by_key。通过 std 启用。
  • std 用于稳定的 sort_by_cached_key。通过 defaultrayon 启用。
  • stacker 在需要时将递归栈溢出到堆。由 default 启用。
  • rayon 用于并行 par_sort*/par_select_many_nth_unstable*

许可证

版权所有 © 2023 Rouven Spreckels [email protected]

本项目包含 rustrayon 的派生作品。有关完整的作者信息,请参阅它们的版本控制历史。相应的版权归其贡献者所有。

与原始作品一样,本项目受以下任一许可证的许可

任选其一。

贡献

除非你明确表示,否则任何由你故意提交以包含在本项目中的贡献(根据 Apache-2.0 许可证定义),都应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~1.4–2.1MB
~39K SLoC