笔者最近在研究一篇代码的时候对于numpy中的concatenate函数和dstack函数产生了较多的疑惑,查看了很多相关的文章,但是感觉很多没有说清楚维度的变化,在此笔者说一下自己的见解。
当我们对三维数组使用.shape函数时,对于结果(a,b,c),有人解释为该三维数组是由a个 b行c列的二维数组组合而成(但是由np.concatenate函数而言,若axis = 2时,函数是在.shape中的第三个维度进行拼接,那么按照这个意思,是为在列上进行拼接吗?)
我们使用dstack函数在deep(深度)上拼接,例:
两个2*3的二维数组m,n
m:
[ [1,2,3]
[3,4,5] ]
n:
[ [5,6,7]
[7,8,9] ]
w = np.dstack([m,n]):
w:
[ [ [1,5]
[2,6]
[3,7] ]
[ [3,7]
[4,8]
[5,9] ] ]
最后生成的w.shape = (2,3,2)
按照上面所说的理论,w.shape的意思很显然是2个3行2列的二维数组,直观看上去也确实如此,但是按照这个说法,原有的2*3的数组形状就发生了变化,仿佛并不是在“深度”层次进行的拼接,让人实在摸不着头脑。
实际上,(2,3,2)当中,最后一个“2”才是代表了深度。也就是说,这个(2,3,2)还是由2个2行3列的数组组成。
可以解释为
c[ : , : , 0 ]:
[ [1,2,3]
[3,4,5] ]
c[ : , : , 1 ]:
[ [5,6,7]
[7,8,9] ]
如此理解,则拼接确实是沿着深度(deep)轴进行拼接的,则对于np.concatenate函数而言,axis = 2时,函数确实是在.shape中的第三个维度进行拼接的。