高阶数组操作


高阶数组操作

除了神奇索引、切片和布尔值子集外,还有很多方式可以处理数组。虽然大部分数据分析应用程序的繁重工作都是由pandas中的高级函数处理的,但有时候可能需要编写一些在现有库中找不到的数据算法。

1、重塑数组

在很多情况下,将数组从一个形状转换为另一个形状,并且不复制任何数据。为了实现这个功能,可以向reshape数组实例方法传递一个表示新形状的元组。假设我们有一个一维数组,我们想要把该数组重新排列进一个矩阵:

结果如下图所示:

多维数组也可以被重塑:

传递的形状维度可以有一个值是-1,表示维度通过数据进行推断:

由于数组的shape属性是一个元组,它也可以被传递给reshape:

reshape的反操作可以将更高维度的数组转换为一维数组,这种操作通常被成为扁平化(flattening)或分散化(raveling):

如果结果中的值在原始数组中是连续的,则ravel不会生成底层数值的副本。flatten方法的行为类似于ravel,但它总是返回数据的副本:

数据可以按照不同的顺序进行重塑或扁平化。

2、C顺序和Fortran顺序

NumPy提供内存中数据布局的控制和灵活性。默认情况下,NumPy数组是按行方向顺序创建的。在空间上,这意味着如果你有一个二维的数据数组,数组每行中的元素存储在相邻的存储单元中。行方向顺序的替代方法是列方向顺序,这意味着每列数据中的值都存储在相邻的内存位置中。

由于历史原因,行和列方向的顺序也分别称为C顺序和Fortran顺序。在FORTRAN 77语言中,矩阵都是列方向的。

像reshape和ravel函数接收一个order参数,该参数表示数据在数组中使用哪种顺序。在大部分情况下,该参数可以被设置为’C’或’F’。

C顺序和Fortran顺序的核心区别就是在维度方向上遍历的方式:

C顺序/行方向顺序首先遍历更高的维度(例如,在轴0上行进之前先在轴1上行进)

Fortran顺序/列方向顺序最后遍历更高的维度(例如,在轴1上行进之前先在轴0上行进)

3、连接和分隔数组

numpy.concatenate可以获取数组的序列(元组、列表等),并沿着输入轴将它们按顺序连接在一起:

对于常见的连接类型有一些方便的函数,比如vstack和hstack。之前的操作可以这样表达:

另一方面,split可以将一个数组沿轴向切片成多个数组:

传递给np.split的值[1,3]表示将数组拆分时的索引位置。

下表是全部有关连接和分隔的函数列表,其中一些仅作为通用concatenate的便捷方法。

3.1 堆叠助手:r 和c

在NumPy命名空间中有两个特殊的对象:r_和c_,它们可以使堆栈数组的操作更为简洁:

这些函数还可以将切片转换为数组:

4、重复元素:tile和repeat

repeat和tile函数是用于重复或复制数组的两个有用的工具。repeat函数按照给定次数对数组中的每个元素进行复制,生成一个更大的数组:

注意:对于NumPy而言,复制或重复数组的需求可能不如其他数组编程框架(如MATLAB)那样常见。其中一个原因是广播通常会更好地满足这一需求。

默认情况下,如果传递一个整数,每个元素都会复制相应的次数。如果传递了一个整数数组,每个元素都会重复相应的不同次数:

多维数组可以在指定的轴向上对它们的元素进行重复:

5、神奇索引的等价方法:take和put

使用整数数组通过神奇索引是获取、设置数组子集的一种方式:

还有其他一些ndarray方法可以用于特殊情况下在单个轴上的数据选取:

如果要在别的轴上使用take,可以传递axis关键字: