由于时常在matlab与python间切换,二者操作有相似性,但其中也隐藏了一些不同,需要十分小心,就比如这个reshape函数。此处给出三段代码例子:
Matlab:
aa = [ 1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10]
cc = reshape(aa, [2, 5, 2])
ee = reshape(aa, [5, 2, 2])
gg = squeeze(cc(1, :, :))%[1 1;3 3;5 5;7 7;9 9]
ff = squeeze(ee(1, :, :))%[1 1;6 6], 即索引出ee的第一个2*2矩阵
Numpy:
a = np.array([[ 1, 1],
[ 2, 2],
[ 3, 3],
[ 4, 4],
[ 5, 5],
[ 6, 6],
[ 7, 7],
[ 8, 8],
[ 9, 9],
[10, 10]])
aa = a.reshape([2, 5, 2])
bb = a.reshape([5, 2, 2])
aa[0]#([[1, 1],
#[2, 2],
#[3, 3],
#[4, 4],
#[5, 5]])
bb[0]#[[1, 1],
#[2, 2]]
Pytorch:
a = torch.tensor([[ 1, 1],
[ 2, 2],
[ 3, 3],
[ 4, 4],
[ 5, 5],
[ 6, 6],
[ 7, 7],
[ 8, 8],
[ 9, 9],
[10, 10]])
aa = a.reshape([2, 5, 2])
bb = a.reshape([5, 2, 2])
aa[0]#([[1, 1],
#[2, 2],
#[3, 3],
#[4, 4],
#[5, 5]])
bb[0]#[[1, 1],
#[2, 2]]
可以看到当对矩阵进行reshape时,原矩阵元素并不是按次序排列放入新的矩阵中,而Numpy与Pytorch则是按照次序排列放入新的矩阵中,这一点需要注意,防止reshape得到的元素不是希望得到的。