是否可以使用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
,它可以将Slice
与start
,stop
和index
一起使用,但我找不到传递的方法不能使用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]);
}
答案 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
。