Rust 社区库: https://crates.io/
在社区库中,有很多贡献者贡献了非常好的库,方便我们日常使用,避免重复造轮子。
关于rust所有使用方法:【点击查看】,或者查看源码:【github地址】
作为numpy的使用者,Rust的多维数组有一些使用区别:以下列举了两者的一些使用区别,
关于更多请查看【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()) | a 使用行为主的内存布局创建形状形状为零的数组(与NumPy不同,这从上下文推断元素类型, 而不是复制 a 的元素类型) |
np.full((3, 4), 7.) | Array::from_elem((3, 4), 7.) | 创建一个用值填充的3×4数组 7. |
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 板条箱。 | 创建随机数数组 |
二、索引和切片
某些方法在所有权和可变性方面有多种变体。该表中仅列出了通过引用获取数组的非可变方法。
例如,.slice()
也有相应的方法.slice_mut()
,.slice_move()
和 .slice_collapse()
。
NumPy | ndarray | 笔记 |
---|---|---|
a[-1] | a[a.len() - 1] | 访问一维数组中的最后一个元素 a |
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行,各列的顺序相反 |
三、数组形状与步幅
a.shape()
,a.dim()
和 a.raw_dim()
所有返回数组的形状,但由于不同的类型。
a.shape()
返回形状为&[Ix]
,(其中 Ix
是usize
),这对于形状的常规操作很有用。
a.dim()
将形状返回为D::Pattern
,这对于图案匹配形状很有用。
a.raw_dim()
将形状返回为D
,这对于创建其他相同形状的数组很有用。
NumPy | ndarray | 笔记 |
---|---|---|
np.ndim(a) 或 a.ndim | a.ndim() | 获取数组的维数 a |
np.size(a) 或 a.size | a.len() | 获取数组中的元素数 a |
np.shape(a) 或 a.shape | a.shape() 或 a.dim() | 得到数组的形状 a |
a.shape[axis] | a.len_of(Axis(axis)) | 获取轴的长度 |
a.strides | a.strides() | 大步向前 a |
np.size(a) == 0 或 a.size == 0 | a.is_empty() | 检查数组是否有零个元素 |
四、多维数组相关的数学计算
方法.mapv()
有相应的方法.map()
, .mapv_into()
,.map_inplace()
, .mapv_inplace()
。
方法.fold()
,有相应的方法 .visit()
,.fold_axis()
,和 .map_axis()
。
NumPy | ndarray | 笔记 |
---|---|---|
a.transpose() 或 a.T | a.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 * b ,a + b 等等。 | a * b ,a + b 等等。 | 逐元素算术运算 |
a**3 | a.mapv(|a| a.powi(3)) | 3的元素方幂 |
np.sqrt(a) | a.mapv(f64::sqrt) | f64 数组元素的平方根 |
(a>0.5) | a.mapv(|a| a > 0.5) | 与where 和别处具有bool 相同形状的s 数组a``true``a > 0.5``false |
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-linalg 和 linxal 。 | 线性代数(矩阵逆,求解,分解等) |
五、数组操作
NumPy | ndarray | 笔记 |
---|---|---|
a[:] = 3. | a.fill(3.) | 将所有数组元素设置为相同的标量值 |
a[:] = b | a.assign(&b) | 将数据从数组复制b 到数组a |
np.concatenate((a,b), axis=1) | stack![Axis(1), a, b] 或 stack(Axis(1), &[a.view(), b.view()]) | a 并b 沿轴1 连接数组 |
a[:,np.newaxis] 或 np.expand_dims(a, axis=1) | a.insert_axis(Axis(1)) | 从创建数组a ,插入新轴1 |
a.transpose() 或 a.T | a.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
对多个维度的概括。这使得可以正确地和有效地压缩在一起的片/子视图阵列在多个维度与 Zip
或azip!()
。其目的类似于 np.nditer
,但是Zip
实现和使用的方式有所不同。
下表列出了在NumPy中具有直接等效项的某些迭代器/生产器。有关生产者和迭代器的更完整介绍,请参见循环,生产者和迭代器。请注意,这些迭代器也有其他变体(带有_mut
后缀),它们产生ArrayViewMut
而不是ArrayView
。
NumPy | ndarray | 笔记 |
---|---|---|
a.flat | a.iter() | 以逻辑顺序遍历数组元素 |
np.ndenumerate(a) | a.indexed_iter() | 平面迭代器产生索引以及每个元素引用 |
iter(a) | a.outer_iter() 要么 a.axis_iter(Axis(0)) | 在第一个(最外)轴上进行迭代的迭代器,产生每个子视图 |
七、二维阵列常用方法
NumPy | ndarray | 笔记 |
---|---|---|
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() | 检查数组是否为正方形 |