写在前面

可能你会不相信,我是从玩pytorch中过来的,我觉得有必要记录一下,transpose这个坑还非踩不可,为了说的清楚一点儿,我多铺垫一点儿,先说说numpy数组维度的理解

引子

>>> a = np.arange(start=0, stop=24)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23])
>>> a = a.reshape(4, 3, 2)
>>> # 老铁们猜一猜长啥样
>>> a
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15],
        [16, 17]],

       [[18, 19],
        [20, 21],
        [22, 23]]])
>>> # 我猜你还没get到点
>>> a.shape
(4, 3, 2)
>>> # 我到底想说啥,还是一头雾水,对吧??哈哈

别揍我,关子卖的挺大,我到底想说啥呢??
可能多用来处理图片的缘故,咱们多用二维数组,二维数组array.shape返回的元组,[0]是有几行的意思(也就是数组所谓的),[1]是有几列的意思(也就是数组所谓的)
而上面引例中,你可以把它理解为四通道的图片,而每一通道可以单独视作一张灰度图, 这样说应该没问题吧?(希望大家能理解),所以按照咱们之前在二维图片的理解,a.shape返回的元组应该有[0]是图片的宽(有几行),[1]是图片的长(有几列),[2]是图片的通道数
所以a.shape应该为:(3, 2, 4)三行两列四通道

然而实际上,a.shape返回的元组是(4, 3, 2),该怎么理解呢??
我这里提出一种解释(只方便理解,也不知道对不对哈)

咱们初次看三维数组a
扒开它的第一层皮,看到了四个二维数组:
       [[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15],
        [16, 17]],

       [[18, 19],
        [20, 21],
        [22, 23]]
而你看到的4个二维数组所在的维度就是三维数组中所谓的第一维shape[0]

取这4个二维数组中的第一个
把它的皮剥掉
        [ 0,  1],
        [ 2,  3],
        [ 4,  5]
没错,我想说的就是,这3个一维数组所在的维度就是三维数组中所谓的第二维shape[1]

咱有始有终,取这3个一维数组中的第一个
把它的皮剥掉,
        0, 1
只剩下两个常数,嗯嗯,这俩常数就是三维数组中所谓的第三维shape[2]

总结一下

看见高维度数组,不要慌,从外向里依次"剥皮",就分别是数组的第1, 2, 3......维度
下一篇博客transpose函数


王尼玛
373 声望13 粉丝

此号作废!