You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中ndarray如何实现逐元素幂运算?

在Rust的ndarray中实现逐元素幂运算

ndarray本身没有提供像+那样的运算符重载来直接实现逐元素幂运算,但可以通过以下几种实用方式实现:

  • 单数组固定指数的逐元素幂运算
    使用mapv方法遍历数组每个元素,对元素应用powf函数:

    use ndarray::Array1;
    
    fn main() {
        let arr = Array1::from(vec![2.0, 3.0, 4.0]);
        let exponent = 2.0;
        let squared_arr = arr.mapv(|x| x.powf(exponent));
        println!("{:?}", squared_arr); // 输出: [4.0, 9.0, 16.0]
    }
    

    mapv会自动处理数组的每个元素,返回一个新数组,无需手动遍历索引。

  • 两个数组对应元素的幂运算(底数数组+指数数组)
    如果需要用一个数组的元素作为底数,另一个数组的对应元素作为指数,可通过zip结合map实现:

    use ndarray::Array1;
    
    fn main() {
        let bases = Array1::from(vec![2.0, 3.0, 4.0]);
        let exponents = Array1::from(vec![2.0, 3.0, 0.5]);
        let result = bases.zip(&exponents).map(|(base, exp)| base.powf(exp));
        println!("{:?}", result); // 输出: [4.0, 27.0, 2.0]
    }
    

    zip会将两个数组的对应元素配对,再通过map对每一对元素执行幂运算。

  • 使用azip!宏处理多维或修改已有数组的场景
    针对多维数组,或者需要将结果写入已有数组的情况,azip!宏更灵活:

    use ndarray::{Array2, azip};
    
    fn main() {
        let bases = Array2::from_shape_vec((2, 2), vec![2.0, 3.0, 4.0, 5.0]).unwrap();
        let exponents = Array2::from_shape_vec((2, 2), vec![2.0, 0.5, 3.0, 1.0]).unwrap();
        let mut result = Array2::zeros_like(&bases);
        
        azip!((r in &mut result, b in &bases, e in &exponents) *r = b.powf(*e));
        println!("{:?}", result);
        // 输出:
        // [[4.0, 1.7320508], [64.0, 5.0]]
    }
    

    azip!支持同时遍历多个数组(包括可变引用),语法直观且性能良好。

内容的提问来源于stack exchange,提问作者Test

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:03:23