在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]])
可以看出,重组之后的数组的顺序排布是根据原数组的最小单位行向量排序的。