Python中np.vstack和np.hstack的应用解释

Python中np.vstack和np.hstack的应用解释

用法说明

对于np.vstack和np.hstack各自有两种用法
• 第1种:np.vstack((a,b))或np.hstack((a,b)),即常规用法,也就是两个维数相等的ndarray在对应的方向上进行合并
• 第2种:np.vstack(a)或np.hstack(a),对一个ndarray在其内部对应的方向上进行合并,这种属于非常规用法

示例

import numpy as np

a = np.arange(0,240)
print(a.shape)
a=a.reshape((60,2,2))
a = a.reshape((5,4,3,2,2))
print(a[0,0,0,:,:])
print(a[4,3,2,:,:])

temp1 = np.vstack((a[0],a[1]))
temp2 = np.vstack(a[0])
temp3 = np.hstack((a[0],a[1]))
temp4 = np.hstack(a[0])
print('temp1 shape',temp1.shape)
#print('temp1',temp1)
print('temp2 shape',temp2.shape)
#print('temp2',temp2)
print('temp3 shape',temp3.shape)
#print('temp3',temp3)
print('temp4 shape',temp4.shape)
#print('temp4',temp4)

b = np.arange(0,144)
print(b.shape)
b=b.reshape((16,3,3))
b = b.reshape((4,4,3,3))
print(b[0,0,:,:])
print(b[3,3,:,:])
temp5 = np.vstack((b[0],b[1]))
temp6 = np.vstack(b[0])
temp7 = np.hstack((b[0],b[1]))
temp8 = np.hstack(b[0])
print('temp5 shape',temp5.shape)
#print('temp5',temp5)
print('temp6 shape',temp6.shape)
#print('temp6',temp6)
print('temp7 shape',temp7.shape)
#print('temp7',temp7)
print('temp8 shape',temp8.shape)
#print('temp8',temp8)

输出结果

(240,)
[[0 1]
 [2 3]]
[[236 237]
 [238 239]]
temp1 shape (8, 3, 2, 2)
temp2 shape (12, 2, 2)
temp3 shape (4, 6, 2, 2)
temp4 shape (3, 8, 2)
(144,)
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[135 136 137]
 [138 139 140]
 [141 142 143]]
temp5 shape (8, 3, 3)
temp6 shape (12, 3)
temp7 shape (4, 6, 3)
temp8 shape (3, 12)

对于第1种用法的说明:

np.vstack
np.vstack是将a,b中第1维进行对齐,然后进行合并,例如例子中的temp1和temp5
temp1中,a[0]的shape是(4,3,2,2),a[1]的shape也是(4,3,2,2),在合并过程中是将第1维(也就是axis=0)对齐,因此合并后的shape是(8,3,2,2)
temp5中,a[0]的shape是(4,3,3),a[1]的shape也是(4,3,3),在合并过程中是将第1维(也就是axis=0)对齐,因此合并后的shape是(8,3,3)
np.hstack
np.hstack是将a,b中第2维进行对齐,然后进行合并,例如例子中的temp3和temp7
temp3中,a[0]的shape是(4,3,2,2),a[1]的shape也是(4,3,2,2),在合并过程中是将第2维(也就是axis=1)对齐,因此合并后的shape是(4,6,2,2)
temp7中,a[0]的shape是(4,3,3),a[1]的shape也是(4,3,3),在合并过程中是将第2维(也就是axis=1)对齐,因此合并后的shape是(4,6,3)

对于第2种用法的说明:

np.vstack
np.vstack是将a的内部中除去第1维后的第1维进行对齐,也就是第2维对齐,然后进行合并,例如例子中的temp2和temp6
temp2中,a[0]的shape是(4,3,2,2),在合并过程中是将第2维(也就是axis=1)对齐,因为有4个(3,2,2),所以合并后的shape就是(12,2,2)
temp6中,a[0]的shape是(4,3,3),在合并过程中是将第2维(也就是axis=1)对齐,因为有4个(3,3),所以合并后的shape就是(12,3)
np.hstack
np.hstack是将a的内部中除去第1维后的第2维进行对齐,也就是第3维对齐,然后进行合并,例如例子中的temp4和temp8
temp4中,a[0]的shape是(4,3,2,2),在合并过程中是将第3维(也就是axis=2)对齐,因为有4个(3,2,2),所以合并后的shape就是(3,8,2)
temp6中,a[0]的shape是(4,3,3),在合并过程中是将第3维(也就是axis=1)对齐,因为有4个(3,3),所以合并后的shape就是(3,12)
高级应用

高级应用:

示例

上接前面的代码

temp_for1 = [np.hstack(i) for i in a]
temp_for2 = np.vstack(temp_for1)
temp_for3 = np.vstack([np.hstack(i) for i in a])
print('temp_for1 len ',len(temp_for1))
print('temp_for1 element shape',temp_for1[0].shape)
#print(temp_for1)
print('temp_for2 shape',temp_for2.shape)
print('temp_for3 shape',temp_for3.shape)

输出结果

temp_for1 len  5
temp_for1 element shape (3, 8, 2)
temp_for2 shape (15, 8, 2)
temp_for3 shape (15, 8, 2)

代码解读

temp_for1 = [np.hstack(i) for i in a]
  1. 对于for i in a循环的解释:代码中的a是上面例子中的a,a的shape为(5,4,3,2,2),而for循环实际上是以第1维(也就是axis=0)为索引对a进行遍历,因为a在第1维上的长度为5,所以for循环也就是循环5次,每次提取出来的i数组形状是(4,3,2,2),即提取出5个形状为(4,3,2,2)的数组;
  2. 对于np.hstack(i)的解释:根据前面的例子,这实际上是np.hstack()的第2种用法,也就是对i进行对齐第3维的方向进行内部对齐排列,因为i数组形状是(4,3,2,2),所以执行np.hstack(i)之后,得到的shape为(3,8,2),根据解释1,这种操作执行了5次,因此得到5个形状为(3,8,2)的数组,而这是一个构成list的表达式,因此[np.hstack(i) for i in a]得到的是一个包含5个元素的list,其中每个元素是一个形状为(3,8,2)的数组
  3. 对于temp_for2 = np.vstack(temp_for1)的解释:这实际上是np.vstack()的第1种用法,temp_for1是一个长度为5的list,这是沿着temp_for1list中每个数组的第1维的方向对齐合并,因为每个元素数组的形状是(3,8,2),一共5个,因此排列后得到temp_for2的形状形状为(15,8,2)
<think>我们被要求回答关于NumPynp.vstacknp.hstack用法的问题。根据系统指令,我们需要使用中文回答,并且确保LaTeX格式正确(行内数学表达式用$...$,独立公式用$$...$$并单独成段)。同时,我们需要生成相关问题,并在回答末尾添加引用标识(如果引用的话)。另外,我们参考了站内引用,但用户的问题是关于np.vstacknp.hstack,所以我们将重点放在这两个函数上。 首先,我们需要明确np.vstacknp.hstack的功能: - np.vstack: 垂直堆叠数组(按行堆叠)。它将多个数组沿着第一个轴(行方向)堆叠起来,要求所有数组的列数相同。 - np.hstack: 水平堆叠数组(按列堆叠)。它将多个数组沿着第二个轴(列方向)堆叠起来,要求所有数组的行数相同。 接下来,我们将通过示例代码来演示这两个函数的用法。示例将包括一维数组二维数组的情况,因为一维数组在堆叠时需要注意维度。 注意:由于一维数组在NumPy中只有一维,没有行列的概念,所以在使用vstackhstack时,有时需要先将其转换为二维行向量或列向量(使用reshape或增加维度的方法)。 我们将按照以下步骤进行: 1. 导入NumPy库。 2. 创建一些示例数组(包括一维二维)。 3. 使用np.vstacknp.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 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值