如何在Rust ndarray数组上高效实现逐元素初等数学运算?
Rust ndarray 初等数学运算实现方案
稳定版可用写法
当前ndarray 0.15.x及更早版本可通过mapv系列方法实现逐元素运算,写法简洁,编译器会自动优化为和手动遍历等效的机器码,无额外性能损耗:
非原地运算(返回新数组)
extern crate ndarray; use ndarray as nd; use ndarray::Array2; fn main() { let matrix = nd::array![[1., 2., 3.], [9., 8., 7.]]; let result = some_math(matrix); println!("{}", result) } fn some_math(mat: Array2<f64>) -> Array2<f64> { // 链式调用实现逐元素exp、sqrt,逻辑和numpy的np.sqrt(np.exp(matrix))完全对齐 mat.mapv(f64::exp) .mapv(f64::sqrt) }
原地运算(节省内存)
如果不需要保留原始数组,可以用mapv_inplace原地修改,避免额外的数组内存分配:
fn some_math(mut mat: Array2<f64>) -> Array2<f64> { mat.mapv_inplace(f64::exp); mat.mapv_inplace(f64::sqrt); mat }
其他初等函数同理,直接替换mapv传入的方法即可,比如:
- sin运算:
mat.mapv(f64::sin) - 自然对数运算:
mat.mapv(f64::ln) - 常用对数运算:
mat.mapv(f64::log10)
后续版本简化写法
目前ndarray有正在评审的功能更新,合并后可以直接通过链式方法调用实现相同需求,写法为matrix.exp().sqrt(),和numpy的使用体验一致,相关用法也已在官方文档的numpy用户迁移指南中有所说明。
内容的提问来源于stack exchange,提问作者null
相关产品推荐
相关产品推荐

