stack()与hstack(),vstack()不同,前者堆叠数组是联结(join),而后两者是串联(concatenation),可以体会一下。
按照指定的轴对数组序列进行联结。
语法格式:numpy.stack(arrays, axis=0, out=None)
参数:
arrays :数组序列,数组的形状(shape)必须相同
代码:
import numpy as np
a=[[1,2,3],
[4,5,6]]
b=[[1,2,3],
[4,5,6]]
c=[[1,2,3],
[4,5,6]]
print("a=",a)
print("b=",b)
print("c=",c)
d=np.stack((a,b,c),axis=0)
print('"axis=0":\n',d)
d=np.stack((a,b,c),axis=1)
print('"axis=1":\n',d)
d=np.stack((a,b,c),axis=2)
print('"axis=2":\n',d)
结果:
(a,b,c)的shape为(3*2*3’),既然是堆叠,那么
当axes=0,就是以0这个维度的元素为单位,[[1 2 3] [4 5 6]]0、[[1 2 3] [4 5 6]]1、[[1 2 3] [4 5 6]]2自成一个单位,按下标[0,1,2]顺序排(堆)起来即可,结果的shape为(3*2*3’);
当axes=1,就是以1这个维度的元素为单位[1 2 3]0、[4 5 6]1、[1 2 3]0、[4 5 6]1、[1 2 3]0、[4 5 6]1,按下标[[0,0,0],[1,1,1]]进行堆叠即可,结果的shape为(2*3*3’);
当axes=2,就是以2这个维度的元素为单位10、21、32、43、54、65、10、21、32、43、54、65、10、21、32、43、54、65,按下标[[[0,0,0],[1,1,1],[2,2,2]],[[3,3,3],[4,4,4],[5,5,5]]]进行堆叠即可,结果的shape为(2*3’*3);
文档中表述的也是这个意思。
numpy.stack
语法格式:numpy.hstack(tup)
参数:
tup:ndarrays数组序列,除了一维数组的堆叠可以是不同长度外,其它数组堆叠时,除了第二个轴的长度可以不同外,其它轴的长度必须相同。
原因在于一维数组进行堆叠是按照第一个轴进行堆叠的,其他数组堆叠都是按照第二个轴堆叠的。
a = np.array((1,2,3))
b = np.array((2,3,4))
np.hstack((a,b))
输出:
array([1, 2, 3, 2, 3, 4])
a = np.array([[1],[2],[3]])
b = np.array([[2],[3],[4]])
np.hstack((a,b))
输出:
array([[1, 2],
[2, 3],
[3, 4]])
代码:
import numpy as np
a=[[1,2,3],
[4,5,6]]
b=[[1,2,3],
[4,5,6]]
c=[[1,2,3],
[4,5,6]]
print(np.hstack((a,b,c)))
沿着第一个轴堆叠数组。
语法格式:numpy.vstack(tup)
参数:
tup:ndarrays数组序列,如果是一维数组进行堆叠,则数组长度必须相同;除此之外,其它数组堆叠时,除数组第一个轴的长度可以不同,其它轴长度必须一样。
a = np.array([1, 2, 3])
b = np.array([2, 3, 4])
np.vstack((a,b))
输出:
array([[1, 2, 3],
[2, 3, 4]])
a = np.array([[1], [2], [3]])
b = np.array([[2], [3], [4]])
np.vstack((a,b))
输出:
array([[1],
[2],
[3],
[2],
[3],
[4]])
代码:
import numpy as np
a=[[1,2,3],
[4,5,6]]
b=[[1,2,3],
[4,5,6]]
c=[[1,2,3],
[4,5,6]]
print(np.vstack((a,b,c)))