发现:当我做高维数组矢量化编程时,在对各种高维数组的初始化时用到了各种数组间的拼接、堆叠、再变形的使用。这些操作都应该尽量只使用numpy或cupy自带的函数,能不用循环就不用循环!!
本文用的函数:numpy.stack、numpy.reshape
想实现的需求:9个大小相同的(1,3)数组,堆叠拼合成一个(3,3,3)大数组。
实现如下:
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等,但都无法提高维度!!!
网友评论