高阶 NumPy(高阶数组操作)
高阶数组操作
一、重塑数组
在很多情况下,我们将数组从一个形状转换为另一个形状,并且不复制任何数据。为了实现这个功能,可以向 reshape 数组实例方法传递一个表示新形状的元组。例如,假设我们有一个一维数组,我们想要把该数组重新排列进一个矩阵:
多维数组也可以被重塑:
传递的形状维度可以有一个值是 -1,表示维度通过数据进行推断:
由于数组的 shape 属性是一个元组,它可以被传递给 reshape:
reshape 的反操作可以将更高维度的数组转换为一维数组,这种操作通常被称为 扁平化(flattening)或 分散化(raveling):
flatten() 和 ravel() 实现的功能是一样:
不同之处在于:
在使用过程中flatten()分配了新的内存,返回数据的副本;
ravel() 不会生成底层数值的副本,返回的是一个数组的视图;
原数组和 ravel() / fatten() 返回后的数组的地址并不一样:
在使用过程中应该注意避免在修改视图时影响原本的数组:
对 ravel() 后的结果进行修改时,会影响原本的数组;对 fatten() 后的结果进行修改时,不会原本的数组产生任何影响。
二、C 顺序和 Fortran 顺序
Numpy 提供了内存中数据布局的控制和灵活性。默认情况下,NumPy 数组是按 行方向顺序 创建的。在空间上,这意味着如果你有一个二维的数据数组,数组每行中的元素存储在相邻的存储单元中。行方向顺序的替代方法是列方向顺序,这意味着每列数据中的值都存储在相邻的内存位置中。
由于历史原因,行和列方向的顺序也分别称为 C 顺序 和 Fortran 顺序。在 FORTRAN 77 语言中,矩阵都是列方向上的。
像 reshape 和 ravel 函数接收一个 order 参数,该参数表示数据在数组中使用哪种顺序。在大部分情况下,该参数可以被设置为 "C" 或 "F"(还有一些不太常用的选项 "A" 和 "K"。)
按 C 顺序(行方向)的重塑和按 Fortran 顺序(列方向)的重塑:
C 顺序 和 Fortran 顺序的核心区别就是在维度方向上遍历的方式:
(1) C 顺序 / 行方向顺序
首先遍历更高的维度(例如,在轴 0 上行进之前先在轴 1 上行进)
(2) Fortran 顺序 / 列方向顺序
最后遍历更高的维度(例如,在轴 1 上行进之前先在轴 0 上行进)
三、连接和分隔数组
numpy.concatenate 可以获取数组的序列(元组、列表等),并沿着输入轴将它们按顺序连接在一起: