Rust Ndarray如何使用整数列表/Vec对ArrayBase进行指定索引切片
ndarray 基于动态整数集合取切片的实现
s!宏只支持编译期可确定的固定整数、连续范围作为切片参数,没法直接传入运行时才能确定长度、内容的整数集合做花式索引,这类场景直接用内置的select方法就能实现。
实现示例
对应你给出的测试数组,选取0、3、4列(即你描述的第1、4、5列,ndarray为0基索引)的代码如下:
use ndarray::{arr2, Axis}; fn main() { let ar = arr2(&[[1.,2.,3., 4.,5.,6.], [7., 8., 9., 10., 11., 12.]]); // Axis(1) 指定在列维度(第二维度)做选择,第二个参数传入任意整数索引集合 let selected = ar.select(Axis(1), &[0, 3, 4]); dbg!(selected); }
运行输出和你期望的结果完全一致:
[[1.0, 4.0, 5.0], [7.0, 10.0, 11.0]]
使用说明
- 传入的索引集合支持任意整数类型的切片、Vec,不需要提前排序,索引可以重复,不需要是连续值
- 如果需要在多个维度做离散索引选择,可以链式调用
select方法,依次指定不同Axis和对应索引集合即可 - 如果需要混合连续范围切片和离散索引选择,可以先调用
slice用s!宏切出连续范围的视图,再对需要离散选择的维度调用select - 注意:离散索引选中的元素在原数组中内存不连续,因此
select返回的是新分配的独立数组,不是原数组的借用视图,不存在生命周期绑定问题。
内容的提问来源于stack exchange,提问作者Anatoly Bugakov
相关产品推荐
相关产品推荐

