Numpy中stack(),hstack(),vstack()函数用法介绍及实例

小鹿同学
小鹿同学
发布时间:2026-10-13 | 2人浏览过
原创

本文详细解析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()函数的用法介绍与实例解析,希望能对大家有所帮助。感兴趣的朋友可继续查阅本站其他相关专题,如有疏漏欢迎留言指正。感谢各位的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表