7 个版本

0.3.3 2023年11月14日
0.3.2 2023年11月14日
0.3.0 2023年9月28日
0.2.3 2023年9月28日
0.1.0 2023年9月6日

#929 in 算法

Download history 9/week @ 2024-03-08 3/week @ 2024-03-15 47/week @ 2024-03-29 10/week @ 2024-04-05

65 每月下载量

自定义许可证

92KB
1.5K SLoC

多维度数组

一个提供多维度数组高级操作的纯Rust库。

设计目标

该库的重点是提供一种简单且无bug的方式来编程多维度数组。特别是

  • 数组的内部表示是密集的(boxed slice),但不是SIMD优化的(除非你显式地创建一个SIMD类型的数组)。
  • 后端不集成BLAS,前端也不集成NumPy,因此这是我能做出的最简洁的设计。
  • API将让NumPy和Rust的std::iter用户感到熟悉。
  • 数组索引可以是实现multidimension::Index的任何类型,并且鼓励在数组索引之间进行类型区分。
  • 该库提供了一种高级的方式来表示许多常见操作,并在必要时提供了安全、模块化的新操作编写方式。

示例

更多信息请参阅文档

let a: Array<_, _> = usize::all(3).map(|x| x + 10).diagonal().collect();
assert_eq!(a.as_ref(), [
    10, 0, 0,
    0, 11, 0,
    0, 0, 12,
]);
let a: Array<bool, usize> = Array::new((), [2, 1]);
let b: Array<usize, &str> = Array::new(3, ["apple", "body", "crane"]);
let ab: Array<bool, &str> = a.compose(b).collect();
assert_eq!(ab.as_ref(), ["crane", "body"])
let a: Array<usize, usize> = usize::all(3).collect();
let b: Array<usize, &str> = Array::new(3, ["apple", "body", "crane"]);
let ab: Array<usize, (usize, &str)> = a.zip(b).collect();
assert_eq!(ab.as_ref(), [
    (0, "apple"),
    (1, "body"),
    (2, "crane"),
]);
let a: Array<_, _> = <(usize, usize)>::all((3, 2)).collect();
assert_eq!(a.as_ref(), [
    (0, 0), (0, 1),
    (1, 0), (1, 1),
    (2, 0), (2, 1),
]);
let b: Array<_, _> = a.transpose::<(), usize, usize, ()>().collect();
assert_eq!(b.as_ref(), [
    (0, 0), (1, 0), (2, 0),
    (0, 1), (1, 1), (2, 1),
]);

贡献

欢迎!

© 2023 Alistair Turnbull。请使用 multidimension at minworks dot co dot uk。

无运行时依赖