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]
- 对于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)的数组;
- 对于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)的数组
- 对于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)