np.array的stack操作

2020年8月18日 / 26次阅读 / Last Modified 2020年8月18日
NumPy

stack操作,就是讲多个array拼接在一起,形成一个更大的array。需要这样的操作,基本上都是为了更好的利用np的array快速计算,将代码vectorized。

np.vstack和np.row_stack

vstack,垂直方向扩展,跟row_stack的效果一样。

>>> import numpy as np
>>> a = np.arange(5)
>>> a
array([0, 1, 2, 3, 4])
>>> np.vstack((a,a,a))
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])
>>> np.vstack((a,a,a)).shape
(3, 5)
>>> np.row_stack((a,a,a)).shape
(3, 5)

以上代码把一个1x5的array,变成了3x5,相当于矩阵多出来了两row。

np.hstack和np.column_stack

hstack,在水平方向扩展,跟column_stack的效果一样。

>>> b = np.arange(5).reshape(5,1)
>>> b
array([[0],
       [1],
       [2],
       [3],
       [4]])
>>> b.shape
(5, 1)
>>> np.hstack((b,b,b))
array([[0, 0, 0],
       [1, 1, 1],
       [2, 2, 2],
       [3, 3, 3],
       [4, 4, 4]])
>>> np.hstack((b,b,b)).shape
(5, 3)
>>> np.column_stack((b,b,b)).shape
(5, 3)

以上代码把一个5x1的array,扩展成5x3,相当于增加了两column。

三维及以上的tensor

基本上可以这样理解,vstack对第1个axis进行扩展,hstack对第2个axis进行扩展。

>>> c = np.arange(6).reshape(1,2,3)
>>> c
array([[[0, 1, 2],
        [3, 4, 5]]])
>>> c.shape
(1, 2, 3)
>>> np.vstack((c,c,c))
array([[[0, 1, 2],
        [3, 4, 5]],

       [[0, 1, 2],
        [3, 4, 5]],

       [[0, 1, 2],
        [3, 4, 5]]])
>>> np.vstack((c,c,c)).shape
(3, 2, 3)
>>> np.hstack((c,c,c))
array([[[0, 1, 2],
        [3, 4, 5],
        [0, 1, 2],
        [3, 4, 5],
        [0, 1, 2],
        [3, 4, 5]]])
>>> np.hstack((c,c,c)).shape
(1, 6, 3)

更高维度也是一样的,我的测试结果只看到numpy对第1个和第2个axis进行操作:

>>> d = np.arange(24).reshape(1,2,3,4)
>>> d
array([[[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]]])
>>> d.shape
(1, 2, 3, 4)
>>> np.vstack((d,d,d))
array([[[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]],


       [[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]],


       [[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]]])
>>> np.vstack((d,d,d)).shape
(3, 2, 3, 4)
>>> np.hstack((d,d,d))
array([[[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]],

        [[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]],

        [[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]],

        [[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]]])
>>> np.hstack((d,d,d)).shape
(1, 6, 3, 4)

当shape不一样时

很简答,报错。

-- EOF --

本文链接:https://www.pynote.net/archives/2368

留言区

《np.array的stack操作》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    stack函数的输入是list也可以 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top