numpy数组的数组拼接方式非常多,特写一篇blog来总结一下。
想转载请留言获批准。
hstack, vstack, dstack, concatenate, stack这些函数都可以用来拼接Numpy数组。还可以利用list来拼接数组。
对于拼接的效果其实我们可以划分为2类:
- 横向拼接:hstack, vstack, concatenate等。横向拼接的意思是指,拼接不会产生更高的维度。比如两个2x2的二维矩阵拼接以后,它还是一个二维矩阵,只是变胖了,变成4x2或者2x4。
- 扩维拼接:dstack, stack等。拼接后会产生更高的维度,两个(2, 2)的二维矩阵拼接会产生(2, 2, 2)的三维矩阵。
1. 水平拼接hstack
np.hstack()
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.hstack((a, b))
print(c)
print(c.shape)
输出为:
array([[1, 1, 2, 2],
[1, 1, 2, 2]])
(2, 4)
2. 垂直拼接数组vstack
np.vstack()
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.vstack((a, b))
print(c)
print(c.shape)
输出为:
array([[1, 1],
[1, 1],
[2, 2],
[2, 2]])
(4, 2)
3.深度拼接dstack
np.dstack()
import numpy as np
a = np.array([1, 2], [3, 4])
b = np.array([5, 6], [7, 8])
c = np.dstack((a, b))
print(c)
print(c.shape)
输出为:
array([[[1, 5],
[2, 6]],
[[3, 7],
[4, 8]]])
(2, 2, 2)
4.concatenate()函数拼接
concatenate()是非常灵活的拼接函数。
np.concatenate()
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.concatenate((a, b), axis=0)
print(c)
print(c.shape)
输出为:
array([[1, 1],
[1, 1],
[2, 2],
[2, 2]])
(4, 2)
可见axis=0时,concatenate的功能和vstack一样。axis=0的含义就是,在第0个维度扩展,其他维度保持不变。这里的第0个维度之前是2,现在是4。
而axis=1时,输出为:
array([[1, 1, 2, 2],
[1, 1, 2, 2]])
(2, 4)
可见axis=1时,concatenate的功能和hstack一样。
注意,axis的取值只能小于被拼接数组的维度(2),所以axis在这里只能取0和1。
但对于多维数组的拼接,concatenate就十分方便了。
5.利用list来实现扩维拼接
我们先构建一个空list
import numpy as np
ls = []
a = np.array([[1, 1],[1, 1]])
b = np.array([[2, 2],[2, 2]])
ls.append(a)
ls.append(b)
c = np.array(ls)
print(c)
print(c.shape)
输出为:
array([[[1, 1],
[1, 1]],
[[2, 2],
[2, 2]]])
(2, 2, 2)
注意,这一操作和dstack是有不同之处的。这个操作是将两个数组叠放在一起而已。
6. 用stack来拼接数组
我们知道stack是扩维拼接,和concatenate有本质的区别。对于两个(2, 2)的数组用stack拼接,我们的结果一定是个三维的,而concatenate的结果是二维的。
涉及到数组的扩维,我们就可以从维度上来理解stack的操作了,初始为2个shape为(2,2)的矩阵,扩展之后:
如果axis = 0,得出结果的shape应该是(_, 2, 2)。看清楚 下划线没有,这个位置的维度是虚位以待的,如果有n(n>=2)个矩阵来拼接,这个下划线的数值就应该是n;(在本博文的栗子里,n=2)
如果axis=1,结果应该是(2, _, 2),在第1个维度上虚位以待;
如果axis=2,结果应该是(2, 2, _),在第2个维度上虚位以待;
np.stack()
import numpy as np
a = np.array([1, 1], [1, 1])
b = np.array([2, 2], [2, 2])
c = np.stack((a, b), axis=0)
print(c)
print(c.shape)
输出为:
array([[[1, 1],
[1, 1]],
[[2, 2],
[2, 2]]])
(2, 2, 2)
当axis=0时,np.stack就可以实现list一样功能的扩维拼接。
再来看axis=1:
为了更容易看到效果,把两个数组的值改一下:
import numpy as np
a = np.array([1, 2], [3, 4])
b = np.array([5, 6], [7, 8])
c = np.stack((a, b), axis=0)
print(c)
print(c.shape)
array([[[1, 2],
[5, 6]],
[[3, 4],
[7, 8]]])
(2, 2, 2)
再看当axis=2时,
array([[[1, 5],
[2, 6]],
[[3, 7],
[4, 8]]])
(2, 2, 2)
可见,axis=2时,stack和dstack的效果一样。