(209, 64, 64, 3) 看起来像一个图像数组的形状,每个图像有 209 个 (64,64,3)。重塑应该将这些图像元素保持在一起并按顺序排列。
用一个更小的例子来说明:
In [845]: arr = np.arange(24).reshape(4,2,3)
In [846]: arr
Out[846]:
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]]])
In [847]: arr[1]
Out[847]:
array([[ 6, 7, 8],
[ 9, 10, 11]])
天真的重塑:
In [848]: x = arr.reshape(6,4)
In [849]: x
Out[849]:
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]])
In [850]: x[:,1]
Out[850]: array([ 1, 5, 9, 13, 17, 21])
选择一列会产生一组与Out[847] 不同的数字。 [6,7,8] 现在在第 2 行和第 3 行之间拆分。[1,5,9...] 来自arr。
整形后转置:(4,2,3)=>(4,(2*3))=>(4,6)=>(6,4):
In [851]: x = arr.reshape(4,6).T
In [852]: x
Out[852]:
array([[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20],
[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]])
In [853]: x[:,1]
Out[853]: array([ 6, 7, 8, 9, 10, 11])
In [855]: x[:,1].reshape(2,3)
Out[855]:
array([[ 6, 7, 8],
[ 9, 10, 11]])
正式的reshape 只要求元素总数不变。但如此处所示,维度的子组也应保持不变,(4,2,3) => (4,6) 或 (8,3),而不是 (6,4)。否则,您将面临重新组合价值观的风险。
只需重塑和转置,x 仍然是 view,与 arr 共享数据缓冲区。但order 不同。进一步重塑(例如ravel)可能会产生副本。
In [859]: arr.__array_interface__['data']
Out[859]: (36072624, False)
In [860]: x.__array_interface__['data']
Out[860]: (36072624, False)
In [861]: x.ravel()
Out[861]:
array([ 0, 6, 12, 18, 1, 7,...])
In [862]: x.ravel(order='F')
Out[862]:
array([ 0, 1, 2, 3, 4, 5, ...])