一个大的numpy数组重新安排

时间:2015-02-18 13:49:35

标签: numpy

我有以下形状的numpy数组中的数据:

import numpy as np

(128L, 512L, 4L, 9L)

如何将其转换为:

(36L, 128L, 512L)

1 个答案:

答案 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])

只是形状不同。