如何在ndarray的map_inplace/par_map_inplace操作中利用当前元素的索引?
在ndarray的map_inplace/par_map_inplace中使用元素索引的方法
map_inplace 和 par_map_inplace 的闭包仅接收元素的可变引用,无法直接获取索引。要在映射过程中使用索引,推荐直接使用带索引的迭代器方法,而非依赖全局计数器(并行场景下全局计数器会引发竞争问题,完全不可靠)。
非并行场景(替代map_inplace)
使用 indexed_iter_mut 遍历,同时获取元素的索引和可变引用:
use ndarray::Array2; let mut array = Array2::from_shape_vec((2, 2), vec![1, 2, 3, 4]).unwrap(); array.indexed_iter_mut().for_each(|((row, col), val)| { *val = row * 10 + col; // 直接使用索引计算新值 });
并行场景(替代par_map_inplace)
需要引入 ndarray-parallel crate,使用 par_indexed_iter_mut 实现安全的并行遍历并获取索引:
use ndarray::Array2; use ndarray_parallel::prelude::*; let mut array = Array2::from_shape_vec((2, 2), vec![1, 2, 3, 4]).unwrap(); array.par_indexed_iter_mut().for_each(|((row, col), val)| { *val = row * 10 + col; // 并行环境下安全使用索引 });
注:如果一定要保留类似 map_inplace 的写法,本质也是基于上述迭代器封装,但直接使用带索引的迭代器更直观高效。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

