是否有可能从ndarray获取非连续切片?

时间:2018-10-16 08:04:28

标签: matrix indexing rust

是否可以使用Vec而不是Slice对象为Rust ndarray矩阵中的列建立索引?我能找到的唯一文档与使用contiguous columns

进行切片有关

具体地说,我正在尝试在Python中实现类似以下代码的内容:

x = np.array([[1,2,3,4,5,6], [7,8,9,10,11,12]])
idx = [0,1,2,4]
x[:, idx]

x[:, idx]的结果将是包含idx中描述的所有行和仅列的矩阵的子集,即[0,1,2,4]

我当前正在使用ndarray(如标题所示),但是我找不到在非连续切片上进行子集化的方法。例如,您可以传递ndarray,它可以将Slicestartstopindex一起使用,但我找不到传递的方法不能使用Slice对象描述的列的列表。

例如:

#[macro_use]
extern crate ndarray;

fn main() {
    let mut x = array![[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]];
    let idx = vec![0, 1, 2, 4];
    // The following works as expected
    let y = x.slice(s![.., 0..2]);
    println!("{:?}", y);
    // This is conceptually what I would like to do but
    // It does not work.
    let y = x.slice(s![.., idx]);
}

1 个答案:

答案 0 :(得分:5)

Numpy中的“高级索引”类似物是ArrayBase::select()方法:

use ndarray::{array, Axis};

fn main() {
    let x = array![[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]];
    let idx = vec![0, 1, 2, 4];
    println!("{}", x.select(Axis(1), &idx));
}

产生输出

[[1, 2, 3, 5],
 [7, 8, 9, 11]]

请注意,结果数组是所选元素的副本(就像在Numpy中一样)。根据您的用例,您可能不需要副本。您有可能只需要遍历idx并为x.slice(s![.., i])中的所有i使用idx