Rust多维数组ndarray
ndarray
- 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板条箱。 | 创建随机数数组 |
二、索引和切片
某些方法在所有权和可变性方面有多种变体。该表中仅列出了通过引用获取数组的非可变方法。 例如,.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行,各列的顺序相反 |
三、数组形状与步幅
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( | ` |
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-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() | 检查数组是否为正方形 |