Python 中 stack,hstack,vstack详解

本文详细解析了NumPy中的stack(), hstack()和vstack()函数,通过实例展示了如何在不同轴上堆叠数组,以及这些函数在数据处理中的应用。

stack()函数

stack此时翻译成堆叠,也就是对数据进行堆叠,函数原型为:stack(arrays, axis=0),arrays可以传数组和列表。axis即在横轴(行)方向或者纵轴(列)方向对数据进行操作,具体含义在我的另一篇博客里面具体介绍了 axis的解释,链接如下:

https://blog.youkuaiyun.com/ding_programmer/article/details/102491181

import numpy as np
a=[[1,2,3],
   [4,5,6]]
print("列表a如下:")
print(a)

print("axis=0")
c=np.stack(a,axis=0)
print(c)

print("axis=1")
c=np.stack(a,axis=1)
print(c)

结果如下:

列表a如下:
[[1, 2, 3], [4, 5, 6]]
axis=0
[[1 2 3]
 [4 5 6]]
axis=1
[[1 4]
 [2 5]
 [3 6]]

使用 stack,可以将一个列表转换为一个numpy数组,当axis=0的时候,和 使用 np.array() 没有什么区别,但是当 axis=1的时候,那么就是对每一行进行在列方向上进行运算,也就是列方向结合,此时矩阵的维度也从(2,3)变成了(3,2)

再来看一个例子:

import numpy as np
a=[[1,2,3,4],
   [5,6,7,8],
   [9,10,11,12]]
print("列表a如下:")
print(a)

print("axis=0")
c=np.stack(a,axis=0)
print(c)

print("axis=1")
c=np.stack(a,axis=1)
print(c)

结果如下:

列表a如下:
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
axis=0
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
axis=1
[[ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]
 [ 4  8 12]]

也算同样的道理,axis=1的时候你就记住每一行对列进行处理

 

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=[[4],[5],[6]]
print(np.hstack((a,b)))

输出:

 [[1 4]
 [2 5]
 [3 6]]

 

也就是按水平(按列的顺序)对数据进行堆叠 h就是 horizontal 水平方向上的意思,vstack正好相反

 

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=[[4],[5],[6]]
print(np.vstack((a,b)))

输出:

[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]

它是垂直(按照行顺序)的把数组给堆叠起来 v就是 vertical 垂直方向的意思。

<think>我们被要求回答关于NumPy中np.vstack和np.hstack用法的问题。根据系统指令,我们需要使用中文回答,并且确保LaTeX格式正确(行内数学表达式用$...$,独立公式用$$...$$并单独成段)。同时,我们需要生成相关问题,并在回答末尾添加引用标识(如果引用的话)。另外,我们参考了站内引用,但用户的问题是关于np.vstack和np.hstack,所以我们将重点放在这两个函数上。 首先,我们需要明确np.vstack和np.hstack的功能: - np.vstack: 垂直堆叠数组(按行堆叠)。它将多个数组沿着第一个轴(行方向)堆叠起来,要求所有数组的列数相同。 - np.hstack: 水平堆叠数组(按列堆叠)。它将多个数组沿着第二个轴(列方向)堆叠起来,要求所有数组的行数相同。 接下来,我们将通过示例代码来演示这两个函数的用法。示例将包括一维数组和二维数组的情况,因为一维数组在堆叠时需要注意维度。 注意:由于一维数组在NumPy中只有一维,没有行和列的概念,所以在使用vstackhstack时,有时需要先将其转换为二维行向量或列向量(使用reshape或增加维度的方法)。 我们将按照以下步骤进行: 1. 导入NumPy库。 2. 创建一些示例数组(包括一维和二维)。 3. 使用np.vstack和np.hstack进行堆叠,并解释结果。 4. 讨论一些注意事项(例如维度匹配问题)。 然后,根据要求,我们将生成相关问题。 由于用户要求结构清晰,我们将分步骤说明。 开始回答:</think>### NumPy中`np.vstack`与`np.hstack`的用法详解 #### 一、核心功能 - **`np.vstack`(垂直堆叠)** 沿行方向(垂直)堆叠数组,要求所有数组的**列数相同**。 数学表示:若数组 $A_{m \times n}$ 和 $B_{k \times n}$,则 `vstack([A, B])` 生成 $(m+k) \times n$ 的矩阵。 - **`np.hstack`(水平堆叠)** 沿列方向(水平)堆叠数组,要求所有数组的**行数相同**。 数学表示:若数组 $A_{m \times n}$ 和 $B_{m \times p}$,则 `hstack([A, B])` 生成 $m \times (n+p)$ 的矩阵。 --- #### 二、示例代码 ```python import numpy as np # 创建示例数组 a = np.array([[1, 2], [3, 4]]) # 2x2 b = np.array([[5, 6]]) # 1x2 c = np.array([[7], [8]]) # 2x1 # 垂直堆叠 (vstack) v_result = np.vstack([a, b]) # 堆叠后维度: (3, 2) print("vstack结果:\n", v_result) # 输出: # [[1 2] # [3 4] # [5 6]] # 水平堆叠 (hstack) h_result = np.hstack([a, c]) # 堆叠后维度: (2, 3) print("hstack结果:\n", h_result) # 输出: # [[1 2 7] # [3 4 8]] ``` --- #### 三、关键注意事项 1. **维度匹配** - `vstack` 要求所有数组列数相同,否则报错:`ValueError: all input arrays must have the same number of columns`。 - `hstack` 要求所有数组行数相同,否则报错:`ValueError: all input arrays must have the same number of rows`。 2. **一维数组的处理** 一维数组会被视为**行向量**,需显式转换为列向量: ```python arr1 = np.array([1, 2, 3]) # 形状 (3,) arr2 = np.array([4, 5, 6]) # 错误用法:直接vstack会堆叠为 (2,3) 而非列 # 正确做法:先转为列向量 arr1_col = arr1[:, np.newaxis] # 形状 (3,1) v_stack_correct = np.vstack([arr1_col, arr2[:, np.newaxis]]) ``` 3. **替代方案** - `np.concatenate([a,b], axis=0)` 等价于 `vstack` - `np.concatenate([a,b], axis=1)` 等价于 `hstack` --- #### 四、典型应用场景 1. **数据集合并** 合并多个数据样本(如CSV文件分块加载后垂直堆叠)。 2. **特征工程** 水平拼接不同特征矩阵(如原始特征与多项式特征合并)。 3. **图像处理** 拼接多张图像(如全景图生成需水平堆叠)[^3]。 --- #### 五、错误处理示例 ```python # 错误案例:列数不匹配 a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6, 7]]) # 3列 ≠ a的2列 try: np.vstack([a, b]) except ValueError as e: print("错误:", e) # 输出: all input arrays must have the same number of columns ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值