在python中,我们可能会接触numpy或者pytorch,tensorflow等,在这些库或者框架中,他们都有reshape方式,通过reshape可以将给定维度的数组换成另外一个维度。当在使用的时候,如果不清楚原理,我们可能会使用错并且还没那么容易发现自己的错误。
对于任意维度的一个数组,我们可以先按照flatten方式将任意维度数组转为1维数组,然后再转换到指定的维度即可。 注意:在转换过程中,转换后的数组元素的个数必须和转换前数组元素的个数一样,对于-1,则表示将剩余元素都分配到那个轴 例如: [[[[5, 3, 9, 2, 1], [6, 2, 0, 0, 1], [6, 2, 6, 5, 7]], [[0, 8, 1, 1, 6], [2, 8, 2, 0, 7], [7, 4, 3, 0, 8]]]] 该数组的维度是(1, 2, 3, 5),想reshape成指定维度数组,则 a. 展开(flatten) [5, 3, 9, 2, 1, 6, 2, 0, 0, 1, 6, 2, 6, 5, 7, 0, 8, 1, 1, 6, 2, 8, 2, 0, 7, 7, 4, 3, 0, 8] b. 从中按顺序选取数组变成3 × 10 [[5, 3, 9, 2, 1, 6, 2, 0, 0, 1], [6, 2, 6, 5, 7, 0, 8, 1, 1, 6], [2, 8, 2, 0, 7, 7, 4, 3, 0, 8]]
c. 变成3 × 1 × 10 [[[5, 3, 9, 2, 1, 6, 2, 0, 0, 1]], [[6, 2, 6, 5, 7, 0, 8, 1, 1, 6]], [[2, 8, 2, 0, 7, 7, 4, 3, 0, 8]]]
d. 变成3 × 5 × 2 [[[5, 3], [9, 2], [1, 6], [2, 0], [0, 1]], [[6, 2], [6, 5], [7, 0], [8, 1], [1, 6]], [[2, 8], [2, 0], [7, 7], [4, 3], [0, 8]]]
e. 变成(-1, 5) 这个实际上变成(30 / 5, 5),故数组元素如下 [[5, 3, 9, 2, 1], [6, 2, 0, 0, 1], [6, 2, 6, 5, 7], [0, 8, 1, 1, 6], [2, 8, 2, 0, 7], [7, 4, 3, 0, 8]]
当使用该方式变化时,依旧可以使用flatten方式理解,只不过在flatten时,需要指定flatten的order=“F”,然后维度越高,越先被转换。
参考博客:https://zhuanlan.zhihu.com/p/72381219