首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否有可能从ndarray获得不连续的切片?

是否有可能从ndarray获得不连续的切片?
EN

Stack Overflow用户
提问于 2018-10-16 16:04:28
回答 1查看 743关注 0票数 5

是否可以使用Vec而不是Slice对象对Rust ndarray矩阵中的列进行索引?我能找到的唯一文档是关于使用contiguous columns进行切片的

具体地说,我正在尝试用Python实现如下代码:

代码语言:javascript
复制
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,它可以接受带有startstopindexSlice,但是我找不到一种方法来传递无法使用Slice对象描述的列的列表。

例如:

代码语言:javascript
复制
#[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]);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-17 03:46:31

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

代码语言:javascript
复制
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));
}

生成输出

代码语言:javascript
复制
[[1, 2, 3, 5],
 [7, 8, 9, 11]]

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52830679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档