gpt4 book ai didi

multidimensional-array - 是否有一个 Rust ndarray 等价于切片上的 numpy 算术?

转载 作者:行者123 更新时间:2023-11-29 07:47:38 24 4
gpt4 key购买 nike

下面的 Python 代码将向二维数组 a 的每一行重复添加向量 [1, 2, 3, 4],仅从第 20 行。

import numpy as np

# an array of shape (100, 4)
a = np.zeros((100, 4), dtype=np.float32)

# and this is the operation explained above
a[20:, :] += [1.0, 2.0, 3.0, 0.0]

ndarray 有一个简单的等价物吗?我已经可以用看起来更复杂、凌乱的代码来做我需要的事情,但我觉得可能有一个整洁的 ndarray.rs 等价物。

好吧,冒着使问题过于复杂的风险,我认为可能有一个我无法挖掘的简单答案...

我正在使用 f32 形状 (n, 8) 的数组来表示三个顶点位置、三个法线分量和两个纹理映射坐标。我正在将多个 3D 对象的缓冲区合并为一个缓冲区,以实现更高效的图形渲染。在 8 宽数组中,前三个值需要缩放,即乘以 &[sx, sy, sz] 然后使用标准 rz.dot(&rx.dot(&ry.dot ())) 函数,最后添加了位移 &[dx, dy, dz]。法线只需要旋转。我当前的系统涉及将数据保存在中间数组变量中。

use ndarray as nd;
array_buffer: nd::Array2<f32>, loc: &[f32; 3], scl: &[f32; 3]...
...
// scale then rotate new verts then add displacement
let new_verts = &new_buf.array_buffer.slice(s![.., 0..3]) * &nd::arr1(scl);
let new_verts = rotate_vec(rot, &new_verts) + &nd::arr1(loc);
// then add them to existing verts
let mut verts = nd::stack(nd::Axis(0),
&[old_buf.array_buffer.slice(s![.., 0..3]),
new_verts.view()]).unwrap();
...

我知道我无法将它减少到 numpy one liner

verts = np.append(old_buf.array_buffer[:,0:3], 
rotate_vec(rot, (new_buf.array_buffer[:,0:3] * scl) + loc))

但我认为也许某些 map 或 zip 变体或宏可能对我有所帮助。

最佳答案

这可以通过与在 Python 中执行的相同的两个步骤来完成:slicing , 然后 add-assigningbroadcast右手数组。

use ndarray::Array2;

let mut a: Array2<f32> = Array2::zeros((100, 4));
{
let mut slice = a.slice_mut(s![20.., ..]);
slice += &ArrayView::from(&[1.0, 2.0, 3.0, 4.0]);
}

切片是用 slice_mut 完成的和 s!用于定义预期范围的宏。切片的结果是一个可变数组 View ,因此,ArrayBase 中看到的大多数操作都是如此。可用,包括算术运算。通过广播规则,一个形状为[4]的右手数组可以自动广播到一个形状为[100, 4]+= 运算符。


如果在从 Python 过渡到 Rust 的 ndarray crate 时出现其他混淆,文档包含 guide for Python users .

关于multidimensional-array - 是否有一个 Rust ndarray 等价于切片上的 numpy 算术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50400966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com