numpy-堆叠函数stack(),hstack(),vstack()与axis=0,1,2...-2,-1

文章目录


这三个函数有些相似性,都是堆叠数组,里面最难理解的应该就是stack()函数了。

先来看一下axis的用法,然后在stack()中就好理解了。

numpy中axis取值的说明

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=None时,默认为对所有元素求值

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()函数

函数原型为:stack(arrays,axis=0)
主要的参数有两个

  • 一个是arrays,也就是用来作为堆叠的数组,要求形状维度必须相等
  • 第二个参数为axis也就是指定依照哪个维度进行堆叠(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]])

例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]]])


np.hstack()函数

函数原型: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堆到一起了

一般情况下:

  • [1,2]的shape值(2,),意思是一维数组,数组中有2个元素。
  • [[1],[2]]的shape值是(2,1),意思是一个二维数组,每行有1个元素。
  • [[1,2]]的shape值是(1,2),意思是一个二维数组,每行有2个元素。

np.vstack()函数

函数原型: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]])

文章目录

猜你喜欢

转载自blog.csdn.net/ljyljyok/article/details/107718839