美文网首页
一个高维数组"拼接 - 堆叠 - 变尺寸"的高级使用

一个高维数组"拼接 - 堆叠 - 变尺寸"的高级使用

作者: 胜负55开 | 来源:发表于2019-10-28 17:40 被阅读0次

    发现:当我做高维数组矢量化编程时,在对各种高维数组的初始化时用到了各种数组间的拼接、堆叠、再变形的使用。这些操作都应该尽量只使用numpy或cupy自带的函数,能不用循环就不用循环!!

    本文用的函数:numpy.stack、numpy.reshape

    想实现的需求:9个大小相同的(1,3)数组,堆叠拼合成一个(3,3,3)大数组。

    图1:想实现的拼合结果

    实现如下:

    import numpy as np
    
    a = [1,11,111]; b = [2,22,222]; c = [3,33,333]
    d = [4,44,444]; e = [5,55,555]; f = [6,66,666]
    g = [7,77,777]; h = [8,88,888]; j = [9,99,999]
    
    a1 = np.array( [a] ).T
    b1 = np.array( [b] ).T
    c1 = np.array( [c] ).T
    d1 = np.array( [d] ).T
    e1 = np.array( [e] ).T
    f1 = np.array( [f] ).T
    g1 = np.array( [g] ).T
    h1 = np.array( [h] ).T
    j1 = np.array( [j] ).T
    
    r = np.stack( (a1,b1,c1,d1,e1,f1,g1,h1,j1), axis=1 ).reshape(3,3,3)
    
    # 结果:
    array([[[  1,   2,   3],
            [  4,   5,   6],
            [  7,   8,   9]],
    
           [[ 11,  22,  33],
            [ 44,  55,  66],
            [ 77,  88,  99]],
    
           [[111, 222, 333],
            [444, 555, 666],
            [777, 888, 999]]])
    

    对numpy.stack的使用说明:该函数的关键点在于axis的数值选择。当原始小数组为二维时:

    • axis = 1:提取待合并数组"每一行",拼凑成一个二维数组;有"几行"就拼成"几页";
    • axis = 2:提取待合并数组"每一列",拼凑成一个二维数组;有"几列"就拼成"几页";
    • axis = 0:单纯把待合并数组,按页依次拼接而已。

    因此,本例完全可以用axis = 2来实现,只不过稍作改变:

    a = [1,11,111]; b = [2,22,222]; c = [3,33,333]
    d = [4,44,444]; e = [5,55,555]; f = [6,66,666]
    g = [7,77,777]; h = [8,88,888]; j = [9,99,999]
    
    a1 = np.array( [a] )
    b1 = np.array( [b] )
    c1 = np.array( [c] )
    d1 = np.array( [d] )
    e1 = np.array( [e] )
    f1 = np.array( [f] )
    g1 = np.array( [g] )
    h1 = np.array( [h] )
    j1 = np.array( [j] )
    
    r = np.stack( (a1,b1,c1,d1,e1,f1,g1,h1,j1), axis=2 ).reshape(3,3,3)
    
    # 结果:
    array([[[  1,   2,   3],
            [  4,   5,   6],
            [  7,   8,   9]],
    
           [[ 11,  22,  33],
            [ 44,  55,  66],
            [ 77,  88,  99]],
    
           [[111, 222, 333],
            [444, 555, 666],
            [777, 888, 999]]])
    

    补充:

    • 例子中的reshape作用非常明显,如果没用reshape将数组变形,根据numpy.stack函数的定义,方式1或方式2拼合后得到的、原始的、单位二维数组尺寸为(1,9)或(9,1);因此用reshape可将其重排为我们想要的(3,3);
    • 本例中想要实现的需求,是我在实际任务中遇到的;其实"numpy.stack + reshape"函数理论上应该可以满足更加复杂的、"维度提高"的数组拼合需要!
    • 其他的简单数组拼合还有:
      np.hstack、np.vstack、np.column_stack、np.row_stack等,但都无法提高维度!!!

    相关文章

      网友评论

          本文标题:一个高维数组"拼接 - 堆叠 - 变尺寸"的高级使用

          本文链接:https://www.haomeiwen.com/subject/pxmbvctx.html