Rust多维数组ndarray

Rust多维数组ndarray

ndarray

Rust Array

  • ndarray生态系统中板条箱的文档:
  • ndarray 基础库
  • ndarray-rand 随机数生成库
  • ndarray-stats 统计方法 顺序统计(最小、最大、中值、分位数等); 汇总统计(平均值、偏斜度、峰度、中心矩等) 分区; 相关分析(协方差、皮尔逊相关); 信息论的度量(熵、KL散度等); 偏差函数(距离、计数、误差等); 直方图计算。
  • ndarray-npy 多维数组的存储与加载
  • ndarray-linalg 线性代数相关函数

一、数组创建

下表显示直接创建多维数组的方法。 也可以通过集合(向量等其它容器)来创建多维数组: 如 ::from_vec()::from_iter()::default()::from_shape_fn(),和 ::from_shape_vec_unchecked()方法。

NumPy                                            写法ndarray笔记
np.array([[1.,2.,3.],[4.,5.,6.]])array![[1.,2.,3.],[4.,5.,6.]]arr2(&[[1.,2.,3.],[4.,5.,6.]])2×3浮点数组字面
np.arange(0., 10., 0.5)np.r_[:10.:0.5]Array::range(0., 10., 0.5)创建一个1-d阵列值0.0.5,…,9.5
np.linspace(0., 10., 11)np.r_[:10.:11j]Array::linspace(0., 10., 11)创建一个具有11个元素的一维数组,这些元素的值0.是…,10.
np.ones((3, 4, 5))Array::ones((3, 4, 5))创建一个3×4×5的数组,其中填充了一(推断元素类型)
np.zeros((3, 4, 5))Array::zeros((3, 4, 5))创建一个用零填充的3×4×5数组(推断元素类型)
np.zeros((3, 4, 5), order='F')Array::zeros((3, 4, 5).f())用Fortran(主要列)内存布局创建一个3×4×5数组,并用零填充
np.zeros_like(a, order='C')Array::zeros(a.raw_dim())使用行为主的内存布局创建形状形状为零的数组
np.full((3, 4), 7.)Array::from_elem((3, 4), 7.)创建一个用值7.填充的3×4数组
np.eye(3)Array::eye(3)创建一个3×3单位矩阵(推断元素类型)
np.array([1, 2, 3, 4]).reshape((2, 2))Array::from_shape_vec((2, 2),vec![1, 2, 3, 4])?根据列表/中的元素创建一个2×2数组Vec
np.array([1, 2, 3, 4]).reshape((2, 2), order='F')Array::from_shape_vec((2, 2).f(),vec![1, 2, 3, 4])Vec使用Fortran(大列)顺序从列表/中的元素创建一个2×2数组
np.random参见ndarray-rand板条箱。创建随机数数组

二、索引和切片

关于Rust中 索引和切片文档

某些方法在所有权和可变性方面有多种变体。该表中仅列出了通过引用获取数组的非可变方法。 例如,.slice()也有相应的方法.slice_mut().slice_move().slice_collapse()

NumPy                       写法ndarray笔记
a[-1]a[a.len() - 1]访问一维数组中的最后一个元素
a[1, 4]a[[1, 4]]访问第1行第4列中的元素
a[1]a[1, :, :]a.slice(s![1, .., ..])a.index_axis(Axis(0), 1)在轴0的索引1处获得3-D数组的2-D子视图
a[0:5]a[:5]a[0:5, :]a.slice(s![0..5, ..])a.slice(s![..5, ..\])a.slice_axis(Axis(0), Slice::from(0..5))获取二维数组的前5行
a[-5:]a[-5:, :]a.slice(s![-5.., ..])a.slice_axis(Axis(0), Slice::from(-5..))获取二维数组的最后5行
a[:3, 4:9]a.slice(s![..3, 4..9])前3行的第4、5、6、7和8列
a[1:4:2, ::-1]a.slice(s![1..4;2, ..;-1])第1和3行,各列的顺序相反

三、数组形状与步幅

关于 Rust 中数组形状与步幅

a.shape()a.dim()a.raw_dim()所有返回数组的形状,但由于不同的类型。 a.shape()返回形状为&[Ix],(其中 Ixusize),这对于形状的常规操作很有用。 a.dim()将形状返回为D::Pattern,这对于图案匹配形状很有用。 a.raw_dim()将形状返回为D,这对于创建其他相同形状的数组很有用。

NumPyndarray笔记
np.ndim(a)a.ndima.ndim()获取数组a的维数
np.size(a)a.sizea.len()获取数组a中的元素数
np.shape(a)a.shapea.shape()a.dim()得到数组的形状a
a.shape[axis]a.len_of(Axis(axis))获取轴的长度
a.stridesa.strides()大步向前a
np.size(a) == 0a.size == 0a.is_empty()检查数组是否有零个元素

四、多维数组相关的数学计算

关于多维数组相关的数学计算查看

方法.mapv()有相应的方法.map().mapv_into().map_inplace().mapv_inplace()。 方法.fold(),有相应的方法 .visit().fold_axis(),和 .map_axis()

NumPy                             写法ndarray笔记
a.transpose()a.Ta.t()a.reversed_axes()数组转置a(查看.t()或移动查看.reversed_axes()
mat1.dot(mat2)mat1.dot(&mat2)二维矩阵乘法
mat.dot(vec)mat.dot(&vec)二维矩阵点一维列向量
vec.dot(mat)vec.dot(&mat)一维行矢量点二维矩阵
vec1.dot(vec2)vec1.dot(&vec2)矢量点积
a * ba + ba * b,a + b逐元素算术运算
a**3`[a.mapv(`
np.sqrt(a)a.mapv(f64::sqrt)f64数组元素的平方根
(a>0.5)[a.mapv(a
np.sum(a)a.sum()a.sum()对元素进行求和a
np.sum(a, axis=2)a.sum(axis=2)a.sum_axis(Axis(2))a沿轴2 求和
np.mean(a)a.mean()a.sum() / a.len() as f64计算f64数组中元素的平均值a
np.mean(a, axis=2) 要么 a.mean(axis=2)a.mean_axis(Axis(2))计算a沿轴2 的元素的平均值
np.allclose(a, b, atol=1e-8)a.all_close(&b, 1e-8)检查数组的元素差异是否在绝对公差内
np.diag(a)a.diag()查看的对角线a
np.linalg参见其他板条箱,例如ndarray-linalglinxal线性代数(矩阵逆,求解,分解等)

五、数组操作

数组相关操作

NumPy                          写法ndarray笔记
a[:] = 3.a.fill(3.)将所有数组元素设置为相同的标量值
a[:] = ba.assign(&b)将数据从数组复制b到数组a
np.concatenate((a,b), axis=1)stack![Axis(1), a, b]stack(Axis(1), &[a.view(), b.view()])ab沿轴1 连接数组
a[:,np.newaxis]np.expand_dims(a, axis=1)a.insert_axis(Axis(1))从创建数组a,插入新轴1
a.transpose()a.Ta.t()a.reversed_axes()数组转置a(查看.t()或移动查看.reversed_axes()
np.diag(a)a.diag()查看的对角线a
a.flatten()Array::from_iter(a.iter())通过展平创建一维数组a

六、迭代器

迭代

ndarray有很多有趣的实现NdProducer特质的迭代器/生产者 ,它是Iterator 对多个维度的概括。这使得可以正确地和有效地压缩在一起的片/子视图阵列在多个维度与 Zipazip!()。其目的类似于 np.nditer,但是Zip实现和使用的方式有所不同。

下表列出了在NumPy中具有直接等效项的某些迭代器/生产器。有关生产者和迭代器的更完整介绍,请参见循环,生产者和迭代器。请注意,这些迭代器也有其他变体(带有_mut后缀),它们产生ArrayViewMut而不是ArrayView

NumPy           写法ndarray笔记
a.flata.iter()以逻辑顺序遍历数组元素
np.ndenumerate(a)a.indexed_iter()平面迭代器产生索引以及每个元素引用
iter(a)a.outer_iter() 要么 a.axis_iter(Axis(0))在第一个(最外)轴上进行迭代的迭代器,产生每个子视图

七、二维阵列常用方法

二维阵列的便捷方法

NumPyndarray笔记
len(a)a.shape[0]a.rows()获取二维数组中的行数
a.shape[1]a.cols()获取二维数组中的列数
a[1]a[1,:]a.row(1)a.row_mut(1)二维数组中第1行的视图(或可变视图)
a[:,4]a.column(4)a.column_mut(4)2-D数组中第4列的视图(或可变视图)
a.shape[0] == a.shape[1]a.is_square()检查数组是否为正方形
updatedupdated2024-08-252024-08-25