对numpy中reshape的理解

在python写神经网络代码时,尽量不要使用(n,)这种秩为1的数组,它既不是行向量也不是列向量,例如:

# 生成存储在a中的5个高斯随机数
a = np.random.randn(5)
# a为"rank 1 array"
a.shape = (5,)

吴恩达也说过,他在写代码时,在不完全确定一个向量的维度时,经常会扔进一个断言语句(assertion statement)。这些断言语句实际上是要去执行的,并且有助于为你的代码提供信息。所以不论你要做什么,不要犹豫直接插入断言语句。为了确保你的矩阵或向量所需要的维数时,不要羞于reshape操作。例如:

assert(a.shape=(5,1))

在编写代码的过程中发现reshape的使用也有技巧,reshape(-1,n)与reshape(n,-1)不同如下:
-1在这里的意思是不知道有几行(列),只确定有n列(行)。如下:

a = np.random.rand(4,3,5)
a
array([[[ 0.4878804 ,  0.12743265,  0.17680707,  0.32685602,  0.62544544],
        [ 0.60786821,  0.58784338,  0.68610644,  0.65207705,  0.108052  ],
        [ 0.73922881,  0.47973041,  0.93406582,  0.44963415,  0.31817899]],

       [[ 0.0231953 ,  0.02266511,  0.80692427,  0.52222112,  0.59992231],
        [ 0.99960463,  0.28123265,  0.17258558,  0.80593665,  0.47848867],
        [ 0.36915728,  0.57934638,  0.68029828,  0.69337123,  0.59262809]],

       [[ 0.54110095,  0.53294373,  0.67067978,  0.47263285,  0.50710533],
        [ 0.96030352,  0.8085529 ,  0.57889135,  0.73899348,  0.00130908],
        [ 0.11137049,  0.92401697,  0.62856698,  0.11944068,  0.75669961]],

       [[ 0.88142597,  0.74872958,  0.20204311,  0.62412543,  0.91898707],
        [ 0.07142023,  0.75627247,  0.63427342,  0.24241224,  0.12031993],
        [ 0.0354988 ,  0.46661072,  0.36959674,  0.24610943,  0.75471856]]])
a.reshape(10,-1)
array([[ 0.4878804 ,  0.12743265,  0.17680707,  0.32685602,  0.62544544,
         0.60786821],
       [ 0.58784338,  0.68610644,  0.65207705,  0.108052  ,  0.73922881,
         0.47973041],
       [ 0.93406582,  0.44963415,  0.31817899,  0.0231953 ,  0.02266511,
         0.80692427],
       [ 0.52222112,  0.59992231,  0.99960463,  0.28123265,  0.17258558,
         0.80593665],
       [ 0.47848867,  0.36915728,  0.57934638,  0.68029828,  0.69337123,
         0.59262809],
       [ 0.54110095,  0.53294373,  0.67067978,  0.47263285,  0.50710533,
         0.96030352],
       [ 0.8085529 ,  0.57889135,  0.73899348,  0.00130908,  0.11137049,
         0.92401697],
       [ 0.62856698,  0.11944068,  0.75669961,  0.88142597,  0.74872958,
         0.20204311],
       [ 0.62412543,  0.91898707,  0.07142023,  0.75627247,  0.63427342,
         0.24241224],
       [ 0.12031993,  0.0354988 ,  0.46661072,  0.36959674,  0.24610943,
         0.75471856]])
a.reshape(-1,10)
array([[ 0.4878804 ,  0.12743265,  0.17680707,  0.32685602,  0.62544544,
         0.60786821,  0.58784338,  0.68610644,  0.65207705,  0.108052  ],
       [ 0.73922881,  0.47973041,  0.93406582,  0.44963415,  0.31817899,
         0.0231953 ,  0.02266511,  0.80692427,  0.52222112,  0.59992231],
       [ 0.99960463,  0.28123265,  0.17258558,  0.80593665,  0.47848867,
         0.36915728,  0.57934638,  0.68029828,  0.69337123,  0.59262809],
       [ 0.54110095,  0.53294373,  0.67067978,  0.47263285,  0.50710533,
         0.96030352,  0.8085529 ,  0.57889135,  0.73899348,  0.00130908],
       [ 0.11137049,  0.92401697,  0.62856698,  0.11944068,  0.75669961,
         0.88142597,  0.74872958,  0.20204311,  0.62412543,  0.91898707],
       [ 0.07142023,  0.75627247,  0.63427342,  0.24241224,  0.12031993,
         0.0354988 ,  0.46661072,  0.36959674,  0.24610943,  0.75471856]])

可以看出,重组之后的数组的顺序排布是根据原数组的最小单位行向量排序的。

发布了14 篇原创文章 · 获赞 4 · 访问量 4342

猜你喜欢

转载自blog.csdn.net/Zhuanzhu22nian/article/details/90167062
今日推荐