Можно ли получить несмежные кусочки от ndarray? - PullRequest
0 голосов
/ 16 октября 2018

Можно ли индексировать столбцы в матрице Rust ndarray, используя Vec вместо Slice объекта?Единственная документация, которую я могу найти, касается нарезки с использованием смежных столбцов

В частности, я пытаюсь реализовать что-то вроде следующего кода в 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]);
}

1 Ответ

0 голосов
/ 16 октября 2018

Аналогом "расширенного индексирования" в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...