Использование ndarray_parallel Zip для перебора строк массива Array2 и элементов массива Array1 - PullRequest
0 голосов
/ 22 сентября 2019

Я хотел бы перебирать строки Array2 и элементы Array1 параллельно и выполнять некоторые вычисления на них с побочными эффектами.

Я пробовал что-то вроде ниже,

extern crate ndarray;
extern crate ndarray_parallel;

use ndarray::{Array2, Array, Zip, Axis};
use ndarray_parallel::prelude::*;

fn main() {
    let mut a = Array2::<f64>::zeros((5, 5));
    let b = Array::from_iter(0..5);
    let c = vec![1,2,3,4,5];
    let mut d = vec![1,2,3,4,5];

    let z = Zip::from(a.axis_iter(Axis(0))).and(&b);
    z.par_apply(|x,y| {d[*y as usize] =  10});
}

Но компилятор жалуется.

Кто-нибудь может посоветовать?

1 Ответ

1 голос
/ 22 сентября 2019

Множество неправильных представлений в вашем коде, исправьте меня, если что-то из перечисленного не соответствует вашему желанию:

  • b, кажется, служит индексом для вектора.Вы можете использовать Zip::indexed для создания индекса вместе с элементом напрямую, нет необходимости в явном массиве индекса.
  • axis_iter возвращает итератор, который проходит по всей оси базовой ndarray.Возможно, вы хотите, чтобы index_axis прошел через один из них.
  • В ваших массивах содержатся как целые числа, так и числа с плавающей точкой.В rust вы не можете применять арифметические операции между ними.
  • par_apply занимает Fn, поэтому он не может изменять захваченные переменные.

Все вещисчитается, что код, вероятно, должен выглядеть следующим образом:

use ndarray::{Array2, Zip, Axis};
use ndarray_parallel::prelude::*;

fn main() {
    let a = Array2::<f64>::zeros((5, 5));
    let mut d = vec![1.,2.,3.,4.,5.];

    Zip::indexed(a.index_axis(Axis(0), 0))
        .and(&mut d)
        .par_apply(|_i, x, y| *y = x + 10.);
}
...