Rust 多维数组 ndarray


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()方法。

NumPyndarray笔记
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板条箱。创建随机数数组

二、索引和切片

关于Rust中 索引和切片文档

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

NumPyndarray笔记
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行,各列的顺序相反

三、数组形状与步幅

关于 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()

NumPyndarray笔记
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 * ba + b等等。a * ba + b等等。逐元素算术运算
a**3a.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-linalglinxal线性代数(矩阵逆,求解,分解等)

五、数组操作

数组相关操作

NumPyndarray笔记
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.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 对多个维度的概括。这使得可以正确地和有效地压缩在一起的片/子视图阵列在多个维度与 Zipazip!()。其目的类似于 np.nditer,但是Zip实现和使用的方式有所不同。

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

NumPyndarray笔记
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()检查数组是否为正方形
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongpingWang

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值