numpy中数据合并,stack,concentrate,vstack,hstack 在python的numpy库中有⼀个函数np.stack(), 看过⼀些博⽂后觉得别⼈写的太复杂,然后⾃⼰有了⼀些理解之后做了⼀些⽐较简单的解释
np.stack
⾸先stack函数⽤于堆叠数组,其调⽤⽅式如下所⽰:
np.stack(arrays,axis=0)
其中arrays即需要进⾏堆叠的数组,axis是堆叠时使⽤的轴,⽐如:
arrays = [[1,2,3,4], [5,6,7,8]]
这是⼀个⼆维数组,axis=0表⽰的是第⼀维,也即是arrays[0] = [1,2,3,4]或者arrays[1] = [5,6,7,8]
axis=i时,代表在堆叠时⾸先选取第i维进⾏“打包”
具体例⼦:
当执⾏np.stack(arrays, axis=0)时,取出第⼀维的1、2、3、4,打包,[1, 2, 3, 4],其余的类似,然后结果如下:
1.
>>> arrays = [[1,2,3,4], [5,6,7,8]]
2.
>>> arrays=np.array(arrays)
3.
>>> np.stack(arrays,axis=0)
4.
array([[1, 2, 3, 4],
5.
山下的女人是老虎
[5, 6, 7, 8]])
当执⾏np.stack(arrays, axis=1)时,先对arrays中的第⼆维进⾏“打包”,也即是将1、5打包成[1, 5],其余的类似,结果如下:
1.
>>> np.stack(arrays, axis=1)
2.
array([[1, 5],
3.
[2, 6],
4.
[3, 7],
5.
[4, 8]])
有这个“打包”的概念后,对于三维的数组堆叠也不难理解了,例如:
a = np.array([[1,2,3,4], [5,6,7,8]])
arrays = np.asarray([a, a , a])
1.
>>> arrays
2.
array([[[1, 2, 3, 4],
3.
[5, 6, 7, 8]],
4.
5.
[[1, 2, 3, 4],
6.
[5, 6, 7, 8]],
7.
8.
[[1, 2, 3, 4],
9.
[5, 6, 7, 8]]])
执⾏np.stack(arrays, axis=0),也就是对第⼀维进⾏打包,结果如下:
1.
>>> np.stack(arrays, axis=0)
2.
array([[[1, 2, 3, 4],
3.
[5, 6, 7, 8]],
4.
5.
[[1, 2, 3, 4],
6.
[5, 6, 7, 8]],
7.
8.
[[1, 2, 3, 4],
9.
[5, 6, 7, 8]]])
执⾏np.stack(arrays, axis=1),也就是对第⼆维进⾏打包,取出第⼆维的元素[1,2,3,4]、[1,2,3,4]、[1,2,3,4],打包,[[1,2,3,4],[1,2,3,4], [1,2,3,4]],对其余的也做类似处理,结果如下:
1.
>>> np.stack(arrays, axis=1)
2.
array([[[1, 2, 3, 4],
3.
[1, 2, 3, 4],
4.
[1, 2, 3, 4]],
5.
6.
[[5, 6, 7, 8],
7.
[5, 6, 7, 8],
8.
秋日田园杂兴[5, 6, 7, 8]]])
执⾏np.stack(arrays, axis=2),与之前类似,取出第三维元素1、1、1,打包[1,1,1],结果如下:
1.
>>> np.stack(arrays, axis=2)
2.
array([[[1, 1, 1],
3.
[2, 2, 2],
4.
[3, 3, 3],
5.
[4, 4, 4]],
6.
7.
[[5, 5, 5],
8.
[6, 6, 6],
9.
[7, 7, 7],
10.
[8, 8, 8]]])
总结⽽⾔,也就是arrays是你要进⾏堆叠的数组,axis控制你要将arrays中哪个维度组合起来(也就是⽂中的“打包”)。
1.
>>> a = np.array([[1, 2], [3, 4]])
2.
>>> b = np.array([[5, 6]])
3.
>>> np.concatenate((a, b), axis=0)
4.
array([[1, 2],
5.
[3, 4],
6.
[5, 6]])
7.
>>> np.concatenate((a, b.T), axis=1)
8.
array([[1, 2, 5],
9.
[3, 4, 6]])
当axis=0时,将b的元素加到a的尾部,这⾥⽐较难以理解的是第⼆个np.concatenate((a, b.T), axis=1),其实也类似,b.T的shape为
(1,2),axis=1,则在a的第⼆维加上b的每个元素,所以这⾥axis=i时, 输⼊参数(a1,)除了第i维,其余维度的shape应该⼀致,例如:
1.
>>> a = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
2.
和时间赛跑课文
>>> b = np.array([[[1,2,3],[4,5,6]]])
3.
>>> np.concatenate((a, b), axis=0)
4.
array([[[1, 2, 3],
5.
[4, 5, 6]],
6.
7.
[[1, 2, 3],
8.
[4, 5, 6]],
9.
10.
[[1, 2, 3],
11.
[4, 5, 6]]])
这⾥a的shape为(2,2,3),b的shape为(1,2,3),axis=0则要求a,b在其他两维的形状是⼀致的,如果直接在其他维度进⾏concatenate操作则会报错(因为axis=1时,a和b在第⼀维的长度不⼀致):
1.
>>> np.concatenate((a, b), axis=1)
2.
Traceback (most recent call last):
3.
File "<stdin>", line 1, in <module>
4.
ValueError: all the input array dimensions except for the concatenation axis must match exactly 5.
>>> np.concatenate((a, b), axis=2)
6.
Traceback (most recent call last):
7.
File "<stdin>", line 1, in <module>
8.
ValueError: all the input array dimensions except for the concatenation axis must match exactly 下⾯⼀个例⼦能够说明:
1.
>>> c=np.array([[[5,6,7],[7,8,9]],[[4,5,6],[5,6,7]]])
2.
>>> c
3.
array([[[5, 6, 7],
4.
[7, 8, 9]],
5.
6.
[[4, 5, 6],
7.
[5, 6, 7]]])
8.
>>> c.shape
9.
(2, 2, 3)
10.
>>> np.concatenate((a, c), axis=1)
11.
array([[[1, 2, 3],
12.
[4, 5, 6],
13.
[5, 6, 7],
来岛又子14.
[7, 8, 9]],四远香
15.
16.
[[1, 2, 3],
如何修改图片17.
[4, 5, 6],
18.
[4, 5, 6],
19.
[5, 6, 7]]])
20.
>>> np.concatenate((a, c), axis=2)
21.
array([[[1, 2, 3, 5, 6, 7],
22.
[4, 5, 6, 7, 8, 9]],
23.
24.
[[1, 2, 3, 4, 5, 6],
25.
[4, 5, 6, 5, 6, 7]]])
np.hstack
蒙古部落np.hstack(tup), 按照列的⽅向堆叠, tup可以是元组,列表,或者numpy数组, 其实也就是axis=1,即np.hstack(tup) = np.concatenate(tup, axis=1)
按照上⾯对concatenate的理解则下⾯的⽰例很好理解
1.
>>> a = np.array((1,2,3))
2.
>>> b = np.array((2,3,4))
3.
>>> np.hstack((a,b))
4.
array([1, 2, 3, 2, 3, 4])
5.
>>> a = np.array([[1],[2],[3]])
6.
>>> b = np.array([[2],[3],[4]])
7.
>>> np.hstack((a,b))
8.
array([[1, 2],
9.
[2, 3],
10.
[3, 4]])
np.vstack
np.vstack(tup), 按照⾏的⽅向堆叠, tup可以是元组,列表,或者numpy数组, 理解起来与上相同np.vstack(tup) = np.concatenate(tup, axis=0)
1.
>>> a = np.array([1, 2, 3])
2.
>>> b = np.array([2, 3, 4])
3.
>>> np.vstack((a,b))
4.
array([[1, 2, 3],
5.
[2, 3, 4]])
1.
>>> a = np.array([[1], [2], [3]])
2.
>>> b = np.array([[2], [3], [4]])
3.
>>> np.vstack((a,b))
4.
array([[1],
5.
[2],
6.
什么然长逝[3],
7.
[2],
8.
[3],
9.
[4]])
对于第⼆段代码,a的第⼀维元素分别时[1],[2],[3],所以堆叠时将b的对应元素直接加⼊