Numpy中stack(),hstack(),vstack()函数用法介绍及实例
本文详细解析Numpy库中stack、hstack和vstack三个函数的用法与区别。通过具体代码实例,深入讲解stack函数中axis参数对维度增加位置及堆叠方式的影响,并对比hstack的水平堆叠与vstack的垂直堆叠行为,帮助开发者准确掌握多维数组的构建技巧。
1.stack()函数
该函数的原型定义为:stack(arrays, axis=0)。其中,arrays参数可以接收数组或列表作为输入。关于axis参数的具体含义将在后文详细阐述,此处先通过一个示例来观察其输出结果。
import numpy as np
a=[[1,2,3],
[4,5,6]]
print("列表a如下:")
print(a)
print("增加一维,新维度的下标为0")
c=np.stack(a,axis=0)
print(c)
print("增加一维,新维度的下标为1")
c=np.stack(a,axis=1)
print(c)
输出:
列表a如下:
[[1, 2, 3], [4, 5, 6]]
增加一维,新维度下标为0
[[1 2 3]
[4 5 6]]
增加一维,新维度下标为1
[[1 4]
[2 5]
[3 6]]在上述示例中,传入的arrays是一个列表。stack()函数的核心作用是将arrays中的每个元素(无论是列表、元组还是numpy数组)转换为numpy数组,随后为每个元素增加一个新的维度(新增维度的位置由axis参数决定),最后将这些增加维度后的元素进行拼接(拼接方式将在下文说明)。
arrays中的每个元素必须具有相同的形状。例如,本例中列表a包含的两个元素[1,2,3]和[4,5,6]形状一致。若将[4,5,6]替换为[4,5],程序将抛出错误。axis参数指定了新增维度的索引位置。需要注意的是,axis的值并非任意设定:如果arrays中的元素是一维的,调用stack()增加一维后变为二维,此时axis只能取0或1(维度索引从0开始)。不同的axis值会导致截然不同的输出结果。
以列表a的第一个元素[1,2,3]为例,当axis=0(默认值)时,相当于在该元素外层包裹一层中括号,形成[[1,2,3]](注:实际输出中元素间无逗号,因stack()先将元素转为numpy数组,数组内部无逗号分隔,此处为方便理解保留逗号示意)。最外层的括号代表维度索引为0。当axis=1时,相当于在元素内部插入中括号,形成[[1],[2],[3]],内部新增的括号代表维度索引为1。同理,对于[4,5,6],axis=0时变为[[4,5,6]],axis=1时变为[[4],[5],[6]]。接下来阐述如何将增加维度后的各元素拼接起来。
如何拼接上述两个元素增加维度后的结果?关键在于理解增加维度即增加中括号,而中括号的位置由axis决定。可将新增的中括号想象为“箱子”。以之前的代码为例,当axis=0时,将套在[1,2,3]外层的括号(即[[1,2,3]]的最外层)视为箱子A,该箱子A同样套在[4,5,6]外层。因此,先将[1,2,3]与[4,5,6]并置,形成[1,2,3],[4,5,6],再统一套上箱子A,得到[[1,2,3],[4,5,6]],这正是axis=0时的程序输出。
当axis=1时,对于[1,2,3],将套在1外层的括号(即[[1],[2],[3]]中1外的括号)视为箱子A,套在2外层的视为箱子B,套在3外层的视为箱子C。同理,箱子A也套在4外层,箱子B套在5外层,箱子C套在6外层。此时,将1与4、2与5、3与6分别组合,形成[1,4,2,5,3,6],随后将箱子A、B、C分别套在(1,4)、(2,5)、(3,6)外侧,得到[[1,4],[2,5],[3,6]],即axis=1时的程序输出。
观察可知,拼接过程实质上是将arrays中各元素在相同位置增加维度的部分(可理解为“小块”)先组合在一起,再统一包裹外层括号,这一过程即为堆叠。
参考下方代码的输出,检验你是否已理解上述逻辑。
import numpy as np
a=[[1,2,3,4],
[5,6,7,8],
[9,10,11,12]]
print("列表a如下:")
print(a)
print("增加一维,新维度的下标为0")
c=np.stack(a,axis=0)
print(c)
print("增加一维,新维度的下标为1")
c=np.stack(a,axis=1)
print(c)
输出:
列表a如下:
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
增加一维,新维度的下标为0
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
增加一维,新维度的下标为1
[[ 1 5 9]
[ 2 6 10]
[ 3 7 11]
[ 4 8 12]]输出结果是否与你的预期一致?还存在另一种情况,请查看下方代码。
import numpy as np
a=[1,2,3,4]
b=[5,6,7,8]
c=[9,10,11,12]
print("a=",a)
print("b=",b)
print("c=",c)
print("增加一维,新维度的下标为0")
d=np.stack((a,b,c),axis=0)
print(d)
print("增加一维,新维度的下标为1")
d=np.stack((a,b,c),axis=1)
print(d)
输出:
('a=', [1, 2, 3, 4])
('b=', [5, 6, 7, 8])
('c=', [9, 10, 11, 12])
增加一维,新维度的下标为0
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
增加一维,新维度的下标为1
[[ 1 5 9]
[ 2 6 10]
[ 3 7 11]
[ 4 8 12]]你会发现输出结果与前述代码相同,因为两者本质一致。当传入类似(a,b,c)的参数时,系统将其视为元组,a、b、c分别为元组的各元素,并分别处理。前文已述,arrays参数可接收列表、元组或numpy数组。因此,传入(a,bc)、[a,b,c]或先定义x=[a,b,c]再传入x,效果完全相同。
上述示例处理的是由一维数组变为二维数组的情况,接下来探讨由二维数组变为三维数组的情形。
import numpy as np
a=[[1,2,3],
[4,5,6]]
b=[[1,2,3],
[4,5,6]]
c=[[1,2,3],
[4,5,6]]
print("a=",a)
print("b=",b)
print("c=",c)
print("增加一维,新维度的下标为0")
d=np.stack((a,b,c),axis=0)
print(d)
print("增加一维,新维度的下标为1")
d=np.stack((a,b,c),axis=1)
print(d)
print("增加一维,新维度的下标为2")
d=np.stack((a,b,c),axis=2)
print(d)
输出:
('a=', [[1, 2, 3], [4, 5, 6]])
('b=', [[1, 2, 3], [4, 5, 6]])
('c=', [[1, 2, 3], [4, 5, 6]])
增加一维,新维度的下标为0
[[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]]
增加一维,新维度的下标为1
[[[1 2 3]
[1 2 3]
[1 2 3]]
[[4 5 6]
[4 5 6]
[4 5 6]]]
增加一维,新维度的下标为2
[[[1 1 1]
[2 2 2]
[3 3 3]]
[[4 4 4]
[5 5 5]
[6 6 6]]]当axis=0时,列表a、b、c的最外层均需包裹“箱子”(即增加中括号)。先将它们并置,形式如下:
[[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]]
随后在最外层统一包裹箱子,得到:
[ [[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]] ]
当axis=1时,列表a、b、c中的[1,2,3]需包裹相同的箱子,[4,5,6]也需包裹相同的箱子。先将它们并置,形式如下:
[ [1,2,3],[1,2,3],[1,2,3] , [4,5,6],[4,5,6],[4,5,6] ]
随后分别在[1,2,3]和[4,5,6]的外侧包裹箱子,得到:
[ [[1,2,3],[1,2,3],[1,2,3]] , [[4,5,6],[4,5,6],[4,5,6]] ]
当axis=2时,列表a、b、c中的1、2、3、4、5、6均需包裹箱子。先将它们并置,形式如下:
[ [1,1,1 , 2,2,2 , 3,3,3], [4,4,4 , 5,5,5 , 6,6,6] ]
随后在1,1,1……6,6,6的外侧分别包裹箱子,得到:
[ [[1,1,1] , [2,2,2] , [3,3,3]], [[4,4,4] , [5,5,5] , [6,6,6]] ]
关于stack()函数的讲解至此结束,这也是本人对该函数的全部理解。
2. hstack()函数
函数原型为:hstack(tup),其中参数tup可以是元组、列表或numpy数组,返回结果为numpy数组。请通过下方代码体会其含义。
import numpy as np a=[1,2,3] b=[4,5,6] print(np.hstack((a,b))) 输出:[1 2 3 4 5 6 ]
import numpy as np a=[[1],[2],[3]] b=[[1],[2],[3]] c=[[1],[2],[3]] d=[[1],[2],[3]] print(np.hstack((a,b,c,d))) 输出: [[1 1 1 1] [2 2 2 2] [3 3 3 3]]
该函数沿水平方向(按列顺序)将数组堆叠起来,而vstack()函数的作用则与之相反。
3. vstack()函数
函数原型为:vstack(tup),参数tup可以是元组、列表或numpy数组,返回结果为numpy数组。请通过下方代码体会其含义。
import numpy as np a=[1,2,3] b=[4,5,6] print(np.vstack((a,b))) 输出: [[1 2 3] [4 5 6]]
import numpy as np a=[[1],[2],[3]] b=[[1],[2],[3]] c=[[1],[2],[3]] d=[[1],[2],[3]] print(np.vstack((a,b,c,d))) 输出: [[1] [2] [3] [1] [2] [3] [1] [2] [3] [1] [2] [3]]
该函数沿垂直方向(按行顺序)将数组堆叠起来。
总结
以上为Numpy中stack()、hstack()及vstack()函数的用法介绍与实例解析,希望能对大家有所帮助。感兴趣的朋友可继续查阅本站其他相关专题,如有疏漏欢迎留言指正。感谢各位的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













