• numpy数组的拼接(扩维拼接和非扩维拼接)


    hstack, vstack, dstack, concatenate, stack这些函数都可以用来拼接Numpy数组。还可以利用list来拼接数组。
    对于拼接的效果其实我们可以划分为2类:

    横向拼接:hstack, vstack, concatenate等。横向拼接的意思是指,拼接不会产生更高的维度。比如两个2x2的二维矩阵拼接以后,它还是一个二维矩阵,只是变胖了,变成4x2或者2x4。
    扩维拼接:dstack, stack等。拼接后会产生更高的维度,两个(2, 2)的二维矩阵拼接会产生(2, 2, 2)的三维矩阵。
    1. 水平拼接hstack

    np.hstack()
    1
    import numpy as np
    a = np.array([1, 1], [1, 1])
    b = np.array([2, 2], [2, 2])
    c = np.hstack((a, b))
    print(c)
    print(c.shape)
    1
    2
    3
    4
    5
    6
    输出为:

    array([[1, 1, 2, 2],
    [1, 1, 2, 2]])
    (2, 4)
    1
    2
    3
    2. 垂直拼接数组vstack

    np.vstack()
    1
    import numpy as np
    a = np.array([1, 1], [1, 1])
    b = np.array([2, 2], [2, 2])
    c = np.vstack((a, b))
    print(c)
    print(c.shape)
    1
    2
    3
    4
    5
    6
    输出为:

    array([[1, 1],
    [1, 1],
    [2, 2],
    [2, 2]])
    (4, 2)
    1
    2
    3
    4
    5
    3.深度拼接dstack

    np.dstack()
    1
    import numpy as np
    a = np.array([1, 2], [3, 4])
    b = np.array([5, 6], [7, 8])
    c = np.dstack((a, b))
    print(c)
    print(c.shape)
    1
    2
    3
    4
    5
    6
    输出为:

    array([[[1, 5],
    [2, 6]],

    [[3, 7],
    [4, 8]]])
    (2, 2, 2)
    1
    2
    3
    4
    5
    6
    4.concatenate()函数拼接
    concatenate()是非常灵活的拼接函数。

    np.concatenate()
    1
    import numpy as np
    a = np.array([1, 1], [1, 1])
    b = np.array([2, 2], [2, 2])
    c = np.concatenate((a, b), axis=0)
    print(c)
    print(c.shape)
    1
    2
    3
    4
    5
    6
    输出为:

    array([[1, 1],
    [1, 1],
    [2, 2],
    [2, 2]])
    (4, 2)
    1
    2
    3
    4
    5
    可见axis=0时,concatenate的功能和vstack一样。axis=0的含义就是,在第0个维度扩展,其他维度保持不变。这里的第0个维度之前是2,现在是4。
    而axis=1时,输出为:

    array([[1, 1, 2, 2],
    [1, 1, 2, 2]])
    (2, 4)
    1
    2
    3
    可见axis=1时,concatenate的功能和hstack一样。
    注意,axis的取值只能小于被拼接数组的维度(2),所以axis在这里只能取0和1。
    但对于多维数组的拼接,concatenate就十分方便了。

    5.利用list来实现扩维拼接
    我们先构建一个空list

    import numpy as np
    ls = []
    a = np.array([[1, 1],[1, 1]])
    b = np.array([[2, 2],[2, 2]])
    ls.append(a)
    ls.append(b)
    c = np.array(ls)
    print(c)
    print(c.shape)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    输出为:

    array([[[1, 1],
    [1, 1]],

    [[2, 2],
    [2, 2]]])
    (2, 2, 2)
    1
    2
    3
    4
    5
    6
    注意,这一操作和dstack是有不同之处的。这个操作是将两个数组叠放在一起而已。

    6. 用stack来拼接数组
    我们知道stack是扩维拼接,和concatenate有本质的区别。对于两个(2, 2)的数组用stack拼接,我们的结果一定是个三维的,而concatenate的结果是二维的。
    涉及到数组的扩维,我们就可以从维度上来理解stack的操作了,初始为2个shape为(2,2)的矩阵,扩展之后:
    如果axis = 0,得出结果的shape应该是(_, 2, 2)。看清楚 下划线没有,这个位置的维度是虚位以待的,如果有n(n>=2)个矩阵来拼接,这个下划线的数值就应该是n;(在本博文的栗子里,n=2)
    如果axis=1,结果应该是(2, _, 2),在第1个维度上虚位以待;
    如果axis=2,结果应该是(2, 2, _),在第2个维度上虚位以待;

    np.stack()
    1
    import numpy as np
    a = np.array([1, 1], [1, 1])
    b = np.array([2, 2], [2, 2])
    c = np.stack((a, b), axis=0)
    print(c)
    print(c.shape)
    1
    2
    3
    4
    5
    6
    输出为:

    array([[[1, 1],
    [1, 1]],

    [[2, 2],
    [2, 2]]])
    (2, 2, 2)
    1
    2
    3
    4
    5
    6
    当axis=0时,np.stack就可以实现list一样功能的扩维拼接。
    再来看axis=1:
    为了更容易看到效果,把两个数组的值改一下:

    import numpy as np
    a = np.array([1, 2], [3, 4])
    b = np.array([5, 6], [7, 8])
    c = np.stack((a, b), axis=0)
    print(c)
    print(c.shape)
    1
    2
    3
    4
    5
    6
    array([[[1, 2],
    [5, 6]],

    [[3, 4],
    [7, 8]]])
    (2, 2, 2)
    1
    2
    3
    4
    5
    6
    再看当axis=2时,

    array([[[1, 5],
    [2, 6]],

    [[3, 7],
    [4, 8]]])
    (2, 2, 2)
    1
    2
    3
    4
    5
    6
    可见,axis=2时,stack和dstack的效果一样。

  • 相关阅读:
    poj3294 Life Forms(后缀数组)
    1628. White Streaks(STL)
    1523. K-inversions(K逆序对)
    1890. Money out of Thin Air(线段树 dfs转换区间)
    1350. Canteen(map)
    1521. War Games 2(线段树解约瑟夫)
    1003. Parity(并查集)
    1470. UFOs(三维树状数组)
    1471. Tree(LCA)
    1494. Monobilliards(栈)
  • 原文地址:https://www.cnblogs.com/klausage/p/15423379.html
Copyright © 2020-2023  润新知