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

发现:当我做高维数组矢量化编程时,在对各种高维数组的初始化时用到了各种数组间的拼接、堆叠、再变形的使用。这些操作都应该尽量只使用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等,但都无法提高维度!!!

你可能感兴趣的:(一个高维数组"拼接 - 堆叠 - 变尺寸"的高级使用)