最近在比较系统地学习一遍numpy的基础操作,感觉合并和分割中有一些小的问题可能在平时会遇到,于是决定用这种分享的方式记录下来,希望能够对大家也有所帮助。
numpy array的合并:
一般来说在numpy中主要使用vstack() hstack() 或者concatenate()进行合并,下面我们依次来看这两种方法:
import numpy as np #引入numpy并且简写为np
a=np.array([1,1,1]) #创建矩阵
b=np.array([2,2,2])
c=np.vstack((a,b)) #vstack表示对数组进行上下拼接 对行进行扩充
d=np.hstack((a,b)) #hstack表示对数组进行水平拼接 对列进行扩充
print('vstack:\n',c)
print('hstack:\n',d)
结果如下
vstack:
[[1 1 1]
[2 2 2]]
hstack:
[1 1 1 2 2 2]
在了解了vstack 和 hstack的方法之后,你可能会想有没有一种更方便的办法能够进行合并,而不需要每次在vstack和hstack里面进行挑选。没错,有的,就是接下来要介绍的concatenate()
concatenate()既可以满足列操作也可以满足行操作,只需要使用一个axis参数在里面,就可以规定究竟是列操作还是行操作,方法如下:
import numpy as np #引入numpy并且简写为np
a=np.array([1,1,1]) #创建矩阵
b=np.array([2,2,2])
c=np.concatenate((a,b),axis=0)
print(c)
[1 1 1 2 2 2]
所以按照这个思路我们再来做一下axis=1的合并
按照道理我们应该会得到一个形如:
[[1 1 1]
[2 2 2]]
这样的矩阵,但是当我们用代码进行测试的时候我们会发现:
得到的结果不是一个矩阵而是一个错误提示
AxisError: axis 1 is out of bounds for array of dimension 1
这个是为什么呢?
这句错误的意思是说我们选择axis=1需要这个矩阵具有两个维度,然而这个矩阵是一个只具有一个维度的,所以我们无法使axis=1对这个矩阵进行操作
这个就很奇怪了,这个矩阵虽然只有一行但是 ,不管怎么说它也是一个1行3列的矩阵才对,应该是有两个维度的。于是这里我们使用shape()测试一下
import numpy as np #引入numpy并且简写为np
a=np.array([1,1,1]) #创建矩阵
b=np.array([2,2,2])
print(a.shape) #得到矩阵的行列特性
得到
(3,)
从这个结果我们了解到了,np.array()在为我们创建这个矩阵的时候并没有为我们创建成(1,3)形式的矩阵,而是直接创建成了一个只有一个维度的一维数组,所以我们用axis选取第二个维度自然是不行的
那么如果我们就是想要用将几个一维数组纵向的进行拼接呢,我们有两个办法。一个是使用我们之前的vstack()。vstack()对矩阵的维度没有要求可以任意的进行拼接。
另一个就是使用reshape,强制的将这个一维数组转换为一个1行3列的矩阵
import numpy as np #引入numpy并且简写为np
a=np.array([1,1,1]).reshape(1,3) #创建矩阵
b=np.array([2,2,2]).reshape(1,3)
c=np.concatenate((a,b),axis=0)
d=np.concatenate((a,b),axis=1)
print('axis=0:\n',c)
print('axis=1:\n',d)
axis=0:
[[1 1 1]
[2 2 2]]
axis=1:
[[1 1 1 2 2 2]]
成功将两个矩阵合并
到这里如果有细心的朋友可能就会有点懵逼了,为什么我在刚才axis=0的时候合并明明是把两个数组直接横着合在一起,现在变成矩阵了却是把两个数组竖着相接,这里就要讲一下对axis参数的理解了
对axis参数的理解
这里的axis参数表示的是我们要对哪一个维度进行操作,在合并中我们对哪个维度进行操作,就代表我们要扩充那一个维度。
axis=0就代表我们要对第一个维度进行操作,同理axis=1就代表我们要对第二个维度进行操作。在刚刚一维数组中我们发现一维数组只有一个维度,这个维度代表的是一维数组的某个元素,而如果放在一个二维的矩阵中我们也可以将其理解为是第一行的某个元素。
所以在这里对一维数组的第一个维度进行操作就相当于对二维矩阵中的第二个维度进行操作(因为一维数组中省略了行的概念,只有一行所以固定就是第一行),也就是相当于是对列的扩充,所以会产生 [[1 1 1 2 2 2]]的结果
同理我们来看二维矩阵中我们选取axis=0的时候就代表我们要对行这个维度进行扩充,所以我们最后能够得到一个列数不变,行数变为原来的两行的两行三列矩阵。axis=1的时候也是一样我们对列进行扩充,得到行数不变,列数变为六列的一个 一行六列的矩阵。