先来看一下axis的用法,然后在stack()中就好理解了。
axis: 0,1,2,3,…是从外开始剥,-n,-n+1,…,-3,-2,-1是从里开始剥。
为了方便下面的理解,可以这样看待:在numpy中数组都有着[ ]标记,则axis=0对应着最外层的[ ],axis=1对应第二外层的[ ],以此类推,axis=n对应第n外层的[ ]。
下面开始从axis=0,axis=1这两个例子开始,使用numpy.ndarray.sum()
函数,深入透彻的理解numpy中axis的用法。
numpy.ndarray.sum()
axis = 0表示对最外层[ ]里的最大单位块做块与块之间的运算,同时移除最外层[ ]:
a= np.array([1,2,3])
a.sum(axis = 0)
>>>6
因为只有一层[ ],所以直接对这一层里的最大单位快1,2,3做运算;
做完加法后本应是[6],但是移除最外层[ ]后,[ ]不存在了,所以返回的是6。
a= np.array([[1,2],[3,4]])
a.sum(axis = 0)
>>>array([4, 6])
有两层[ ],最外层[ ]里的最大单位块分别为[1,2],[3,4],对这两个单位块做块与块之间的运算,[1,2]+[3,4] = [4, 6];
做完加法后本应是[[4, 6]],但是移除最外层[ ]后,原来的两层[ ]变成一层[ ],所以返回结果为 [4, 6]。
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a.sum(axis = 0)
>>>array([[12, 14], [16, 18]])
有三层[ ],最外层[ ]里的最大单位块分别为[[1,2],[3,4]],[[11,12],[13,14]],对这两个单位块做块与块之间的运算,[[1,2],[3,4]] + [[11,12],[13,14]] = [[12, 14], [16, 18]];
做完加法后本应是[[[12, 14], [16, 18]]],但是移除最外层[ ]后,原来的三层[ ]变成两层[ ],所以返回结果为[[12, 14], [16, 18]];
axis= 1表示对第二外层[]里的最大单位块做块与块之间的运算,同时移除第二外层[]:
a= np.array([1,2,3])
a.sum(axis = 1)
>>>ValueError: 'axis' entry is out of bounds
因为只有一层[ ],axis取值只有一个,为0
a= np.array([[1,2],[3,4]])
a.sum(axis = 1)
>>>array([3, 7])
>>> a=np.array([[2],[3]])
>>> a.sum(axis=1)
array([2, 3])
有两层[ ],第二外层[ ]里的最大单位块有两组(因为有两个第二外层[ ]),第一组是1,2,第二组是3,4,分别对这两个单位块做块与块之间的运算,第一组结果为1+2=3,第二组结果为3+4=7;
做完加法后本应是[[3],[7]],但是 移除第二外层[ ] 后,原来的两层[ ]变成一层[ ],所以返回结果为[3, 7]。
对于第二个例子,在第二层[ ]中,第一个[ ]里的元素只有一个2,第二个[ ]里的元素只有一个3,都没有可以相加的其他元素,因此返回本身,最后去掉第二层[ ],为[2,3]
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a.sum(axis = 1)
>>>array([[ 4, 6], [24, 26]])
有三层[ ],第二外层[ ]里的最大单位块有两组(因为有两个第二外层[ ]),第一组是[1,2],[3,4],第二组是[11,12],[13,14],分别对这两个单位块做块与块之间的运算,第一组结果为[1,2]+[3,4] = [ 4, 6],第二组结果为[11,12]+[13,14] = [24, 26];
做完加法后本应是[[[ 4, 6]], [[24, 26]]],但是 移除第二外层[ ] 后,原来的三层[]变成两层[],所以返回结果为[[ 4, 6], [24, 26]]
axis = 2,3,4,5也如此分析
>>> a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
>>> a.sum(axis=2)
array([[ 3, 7],
[23, 27]])
函数原型为:stack(arrays,axis=0)
主要的参数有两个
理解了axis的用法也就能理解是根据什么来进行堆叠了,找到要堆叠的元素的维度,然后对应位置的元素堆叠起来即可
例1
>>> a=[[1,2,3],
... [4,5,6]]
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> a[1][1]
5
>>> c=np.stack(a,axis=0) #axis=0表示将最外层[ ]里,只有两个元素[1, 2, 3],[4, 5, 6],直接堆叠
>>> c
array([[1, 2, 3],
[4, 5, 6]])
>>> c[1][1]
5
>>> c=np.stack(a,axis=1) #axis=1则看第二层的[ ],每个第二层的[ ]都有三个元素1,2,3和4,5,6,因此对应元素就行堆叠
>>> c
array([[1, 4],
[2, 5],
[3, 6]])
>>> type(c)
例2
>>> a=[1,2,3,4]
>>> b=[5,6,7,8]
>>> c=[9,10,11,12]
>>> d=np.stack((a,b,c),axis=0) #(a,b,c)表示将a,b,c合起来看作一个数组,分析同上
>>> d
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
>>>
KeyboardInterrupt
>>> d=np.stack((a,b,c),axis=1)
>>> d
array([[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11],
[ 4, 8, 12]])
例3:三维的情况
>>> a=[[1,2,3],
... [4,5,6]]
>>> b=[[1,2,3],
... [4,5,6]]
>>> c=[[1,2,3],
... [4,5,6]]
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> c
[[1, 2, 3], [4, 5, 6]]
>>> d=np.stack((a,b,c),axis=0)
>>> d
array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
>>> d=np.stack((a,b,c),axis=1)
>>> d
array([[[1, 2, 3],
[1, 2, 3],
[1, 2, 3]],
[[4, 5, 6],
[4, 5, 6],
[4, 5, 6]]])
>>> d=np.stack((a,b,c),axis=2)
>>> d
array([[[1, 1, 1],
[2, 2, 2],
[3, 3, 3]],
[[4, 4, 4],
[5, 5, 5],
[6, 6, 6]]])
函数原型:hstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。
它其实就是水平(按列顺序)把数组给堆叠起来,vstack()函数正好和它相反。
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> np.hstack((a,b))
array([1, 2, 3, 4, 5, 6])
>>> a=[[1],[2],[3]]
>>> b=[[1],[2],[3]]
>>> c=[[1],[2],[3]]
>>> d=[[1],[2],[3]]
>>> np.hstack((a,b,c,d))
array([[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]])
>>> a=np.array([1,2,3])
>>> a.shape
(3,) #3行一列
注意,a=[[1],[2],[3]]是三行一列的,所以横着堆叠就是1堆到一起了
一般情况下:
函数原型:vstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。
它是垂直(按照行顺序)的把数组给堆叠起来。
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> np.vstack((a,b))
array([[1, 2, 3],
[4, 5, 6]])
>>> a=[[1],[2],[3]]
>>> b=[[1],[2],[3]]
>>> c=[[1],[2],[3]]
>>> d=[[1],[2],[3]]
>>> np.vstack((a,b,c,d))
array([[1],
[2],
[3],
[1],
[2],
[3],
[1],
[2],
[3],
[1],
[2],
[3]])