vstack、hstack和dstack都用于把几个小数组合并成一个大数组。它们的差别是小数组的元素在大数组中的排列顺序有所不同。把两部手机摆到一起有几种方式?水平的左右排列,垂直的上下排列,还可以把手机一扣在手机二的顶上,把它们摞起来。这三种排列方式体现了vstack、hstack和dstack在合并数组时的特点。
一、vstack
vstack实现了轴0合并。vstack的字母v表示vertical的意思,提示用户把它想象成垂直合并。观察一维和二维数组的情况,b在结果中被排在a的后面,形成a在上,b在下的垂直关系。
import numpy as np a = [1,2] b = [3,4] c = np.vstack((a,b)) print(c) a = [[1,2]] b = [[3,4]] c = np.vstack((a,b)) print(c) ''' [[1 2] [3 4]] [[1 2] [3 4]] '''
显然,a被存到c[0]中,b被存到c[1]中,a、b二者在0号轴上连接起来。对于两个高维数组a、b来说,vstack在合并a、b时已全无垂直或上下这样直观的位置关系,但a、b仍旧保持在0号轴上a在前2层,b在后2层的位置关系。程序中np.sum(c[2:]-b)等于0表示c[2:]和b拥有同样的元素,np.sum(c[:2]-a)等于0表示c[:2]与a有同样的元素。想想c有什么样的形状?答曰(4,3,4,5)。
a = np.arange(120).reshape(2,3,4,5) b = np.arange(120,240).reshape(2,3,4,5) size = a.shape[0] print(np.sum(c[:2]-a)) print(np.sum(c[2:]-b)) # 0 # 0二、hstack
hstack表示轴1合并。hstack的字母h来自于horizontal,表示两个数组是水平的,hstack((a,b))将把b排在a的右边的意思。
print(np.hstack([[1,2],[3]])) # [1,2,3]
现在没有增维,结果不像vstack,对一维数组合并的结果还是一维的。
a = [[1,2], [3,4]] b = [[5], [6]] print(np.hstack([a,b])) # [[1 2 5] # [3 4 6]]
在结果c中,b就在a的右边。它表明c中b元素的1轴坐标会大于a元素的1轴坐标。对于高维数组而言,如下例所示,a的a[:0]、a[:1]、a[:,2],构成c的c[:,0]、c[:,1]、c[:,2],b的[:,0]构成c的c[:4]。a、b在1号轴坐标上被连接起来。
a = np.arange(120).reshape(2,3,4,5) b = np.arange(120,160).reshape(2,1,4,5) size = a.shape[1] c = np.hstack([a,b]) print(np.sum(c[:,:size]-a)) print(np.sum(c[:,size:]-b)) # 0 # 0
三、dstack
dstack自然是说deep stack了,它是轴2合并。dstack([a,b])把a和b摞在一起,像一摞扑克牌一样。
a = np.array([1,2]) b = np.array([3,4]) print(np.dstack((a,b))) # [[[1 3] # [2 4]]]
咦,例子的结果跟vstack有点像嘛。前面是长度和宽度的问题,现在是高度的问题了,所以结果变成了三维的。
现在,a、b在2号轴上被连接起来。如果a、b是一维数组,或是二维数组,系统首先将a、b变为三维数组,再按照2号轴进行合并操作,把a追加到c中,再把b的元素排到c中。在结果中,来自于b的元素的2号轴的下标将变大,因此排到a的后面,但各元素其它轴的坐标不变。
a = np.array([[1,2], [3,4]]) b = np.array([[5,6], [7,8]]) c = np.dstack([a,b]) print(c) ''' [[[1 5] [2 6]] [[3 7] [4 8]]] ''' print(c[:,:,0]) ''' [[1 2] [3 4]] ''' print(c[:,:,1]) ''' [[5 6] [7 8]] '''下面的代码演示了对于更高维的数组,如4维数组轴2合并的结果是b沿2号轴排列到a的后面。print(np.sum(c[:,:,4:6]-b))的结果为0表示c[:,:,4] == b[:,:,0],c[:,:,5] == b[:,:,1],也就是说c的2号轴的4、5下标是b的元素,自然,前面的0、1、2、3下标的元素是a的元素。
a = np.arange(120).reshape(2,3,4,5) b = np.arange(120,180).reshape(2,3,2,5) c = np.dstack([a,b,b]) print(np.sum(c[:,:,:4]-a)) # 0 print(np.sum(c[:,:,4:6]-b)) # 0 print(np.sum(c[:,:,6:]-b)) # 0一个元素,写于20180411