我有以下形状的numpy数组中的数据:
import numpy as np
(128L, 512L, 4L, 9L)
如何将其转换为:
(36L, 128L, 512L)
答案 0 :(得分:2)
要重塑阵列,您可以使用:
arr.reshape(36, 128, 512)
但请注意,这可能不会按照您打算的顺序放置值, 根据{{3}},
你可以把重塑视为第一次破坏数组(使用 给定索引顺序),然后插入raveled数组中的元素 使用与使用的相同类型的索引顺序进入新数组 为了散乱。
考虑到原始形状,可以保留128和512长轴 正在寻找
arr.reshape(128, 512, 36).transpose(2, 0, 1)
或(等效地)
np.rollaxis(arr.reshape(128, 512, 36), -1)
代替。
例如,如果您的原始数组是
arr = np.arange(128*512*4*9).reshape(128,512,4,9)
然后
arr.reshape(128, 512, 36).transpose(2, 0, 1)
生成一个新的形状(36, 128, 512)
数组:
>>> arr.reshape(128, 512, 36).transpose(2, 0, 1).shape
(36, 128, 512)
要查看arr.reshape(36, 128, 512)
和arr.reshape(128, 512, 36).transpose(2, 0, 1)
之间的区别,我建议您在交互式解释器中使用较小的数组:
In [61]: arr = np.arange(2*2*3*4).reshape(2,2,3,4)
In [62]: arr
Out[62]:
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]]],
[[[24, 25, 26, 27],
[28, 29, 30, 31],
[32, 33, 34, 35]],
[[36, 37, 38, 39],
[40, 41, 42, 43],
[44, 45, 46, 47]]]])
假设您要保留长度为2的轴,并将其他轴重新整形为长度为12的单轴。
如果您使用arr.reshape(12,2,2)
,则长度为2的原始轴不会被保留,因为这些轴中的值会发生变化。例如,
In [70]: arr[0,0,...]
Out[70]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
与
中的值不对应In [66]: arr.reshape(12,2,2)[:,0,0]
Out[66]: array([ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44])
但它们确实对应于
中的值In [68]: arr.reshape(2,2,12).transpose(2, 0, 1)[:,0,0]
Out[68]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
只是形状不同。