如何在Rust中对ndarray矩阵的两行执行减法运算?
解决Rust ndarray中视图无法直接相减的编译错误
原代码
use ndarray::Array; fn main() { let random = Array::ones((5, 3)); println!("{:?}", random); let test = random.row(0) - random.row(1); println!("{:?}", test); }
编译错误
error[E0369]: cannot subtract `ArrayBase<ViewRepr<&_>, Dim<[usize; 1]>>` from `ArrayBase<ViewRepr<&_>, Dim<[usize; 1]>>`
问题原因
你推测的没错,random.row(0)和random.row(1)返回的是数组行视图(ArrayView),本质是对原数组数据的引用,ndarray并未为两个视图直接实现减法运算符。
解决方案
方案1:将视图转为拥有所有权的数组
通过.to_owned()或.to_array()把视图转换为独立的数组,即可正常执行减法:
use ndarray::Array; fn main() { let random = Array::ones((5, 3)); println!("{:?}", random); let test = random.row(0).to_owned() - random.row(1).to_owned(); println!("{:?}", test); }
这种方式简单直接,但会复制原数组对应行的数据,适合小型数组场景。
方案2:用Zip宏逐元素计算(避免复制)
如果想避免数据复制,可使用ndarray的Zip宏逐元素执行减法并生成新数组,适合处理大数组:
use ndarray::{Array, Zip}; fn main() { let random = Array::ones((5, 3)); println!("{:?}", random); let row0 = random.row(0); let row1 = random.row(1); let test = Zip::from(&row0) .and(&row1) .map(|a, b| a - b) .collect::<Array<_,_>>(); println!("{:?}", test); }
内容的提问来源于stack exchange,提问作者HAL
相关产品推荐
相关产品推荐

