接下来我们会学习如何改造数组方便我们使用,这里的改造包括对数组进行变形,翻转或者转置数组,连接数组,以及分割数组等等。
01
数组变形
可以实现数组变形的函数有好几个:
(1)最常见的也是最主要的就是我们之前提到过的reshape函数,可以将数组从一个形状转变成另外一个不同的形状。
(2)有时候我们想让高维数组展开成一维,那么我们可以使用flatten函数。先建好一个数组A,然后输出A.flatten()就可以完成降维。当然,我们可以选择展开式的秩序order。如果order='F',就是按列展开;如果order='C',就是按行展开。
(3)另外一个将数组展开铺平的函数叫ravel函数,它和flatten功能其实差不多,而且默认的展开顺序也是order='C',即按行展开。如果选择order='F'就是按列展开。
我们用几个例子来分别讲解这三个函数:
原始数组A是一个从0到11的一维数组;B是通过reshape函数改造成2*6的二维数组;C和D分别从B展开降到一维。其中C是按列顺序降维,而D是按照行顺序。我们看一下运行结果:
02
数组翻转
从数学角度而言,二维数组就是矩阵。在矩阵操作中,有一项叫转置,是将矩阵元素位置的行列互换,比如原来在(1,2)这个位置的元素,会和(2,1)这个位置的元素进行互换。在Numpy中我们有两种方式来实现数组的翻转:
(1)transpose函数,将被翻转目标A放到函数中,像这样np.transpose(A)就可以了。
(2)第二种办法更加简便,直接在目标数组A后面加个.T就行了。
A是一个4*2的数组,B和C分别通过两种方式翻转A,虽然函数不同,但是结果却是一样的:
03
数组连接
连接数组顾名思义是将两个或多个数组按照一定的方式连接起来,常用的数组连接有一下几种函数:
(1)concatenate函数,使用方式是把被连接的数组依次放进去,用逗号隔开,再用括号括起来;还有一个参数axis来指定按照哪一个轴连接。axis默认值是0,意思是沿着第一个轴连接,如果你设置成1,那么就是沿着第二个轴连接。
(2)stack函数,它和concatenate函数有一点不同。stack函数更多是一种堆叠,会在原来的维度上增加一个维度;而concatenate不会增加维度。
(3)hstack函数,它是stack函数的变种,其中h的意思是horizontal,水平的。顾名思义,它会将数组按水平的方式连接。关键是hstack不像stack一样增加维度,这一点是很好的。
(4)vstack函数,也是stack函数的变种,其中v的意思是vertical,垂直的。顾名思义,它会将数组按竖直的方式连接。
A和B都是2*2的数组,我们分别用四个函数去连接它们。第一个是concatenate函数,axis=1表示沿着第二个轴,也就是水平连接;第二个是stack函数,同样是沿着第二个轴,在这里我们省略了axis参数;第三个是hstack,竖直方向连接;第四个是vstack,水平方向连接。
运行结果:
注意到第二个打印结果是一个三维数组,这种连接方式不是很常用;而concatenate当axis=1时就相当于hstack,axis=0时就相当于vstack函数。
04
数组分割
数组分割相当于数组连接的逆向操作,将一个大数组分割成好几个数组。常用的函数有三个:
(1)split函数,这个函数有三个参数。第一个参数ary就是被分割的数组,第二参数叫indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭),第三个参数axis是按照哪个轴切分。
(2)hsplit函数,水平方向上切分。
(3)vsplit函数,竖直方向上切分。
A是一个4*4的二维数组,我们用了三种方式去分割。大家猜一猜有没有哪两个分割结果会一样?
运行结果: