【发布时间】:2021-11-16 10:22:44
【问题描述】:
我只是想为 Rust ndarray 做基本的数学运算(例如,sin、exp、log、sqrt ...)。但是,通过阅读 ndarray 的文档,我没有找到任何有用的示例。
比如说:
extern crate ndarray;
use ndarray as nd;
fn main() {
let matrix = nd::array![[1., 2., 3.], [9., 8., 7.]];
let result = some_math(matrix);
println!("{}", result)
}
fn some_math(...) {
//Here I would like to do elementwise exp() and sqrt
sqrt(exp(...))
// Using f64::exp would fail.
}
如何有效地实现这样的some_math?我当然可以通过循环遍历矩阵的元素来进行元素操作,但这听起来不太好,我不想这样做。
在 python 的numpy 中,这就是np.sqrt(np.exp(matrix))。我的意思是 Rust 确实是一门很棒的语言,但是,即使是简单的代数也很不方便(缺乏适当的生态系统)。
更新:ndarray 正在进行pull request。如果这被接受,那么您可以简单地执行matrix.exp().sqrt() 等。
ndarray-doc 中有一个非常 hidden page 告诉如何进行此类数学运算。
【问题讨论】:
-
用
mapv_into()怎么样? -
@SvenMarnach 看起来像一个解决方案。它应该是“默认”方式吗?
-
我不确定,但看起来很合理。如果您想要一个新数组而不是更改现有数组,还有
mapv()方法。另请注意,自己迭代数组本身并没有错。在 Python 中,这将对性能造成毁灭性的影响,但在 Rust 中则不然,因为最终无论如何都需要这样做。 -
@SvenMarnach 您想详细说明一下答案吗?在
numpy或numba中,这些操作实际上是在它们的后端并行实现的。我想知道mapv()是否也做类似或多线程的事情? -
我不认为 numpy 在多个线程中运行操作(尽管 numba 可能)。从传递给
mapv_into()和map_inplace()的函数所需的特征来看,它们也不是多线程的——但有par_map_inplace()和par_mapv_inplace(),它们是。
标签: rust rust-ndarray