ndarray map_inplace with index

62 views Asked by At

How do you map_inplace or par_map_inplace in an ndarray while using the index of the current element you're mapping over?

array.map_inplace(|val| {
    *val = (expression involving the index)
})

You can keep track of a global counter for the non-parallel version, but this won't work for the parallel version.

1

There are 1 answers

0
kmdreko On BEST ANSWER

For a non-parallel in-place mutation with index, you can use .indexed_iter_mut() like so:

array.indexed_iter_mut()
    .for_each(|(index, val)| {
        *val = (expression involving the index)
    });

For a parallel version, you would need to use rayon's .par_bridge() since IndexedIterMut isn't inherently a parallel iterator (ndarray uses rayon internally for parallelization):

use rayon::iter::{ParallelBridge, ParallelIterator};

array.indexed_iter_mut()
    .par_bridge()
    .for_each(|(index, val)| {
        *val = (expression involving the index)
    });