Python 将数组重塑为方形数组

Python 将数组重塑为方形数组,python,arrays,numpy,concatenation,reshape,Python,Arrays,Numpy,Concatenation,Reshape,我有一个数字数组,其形状是26*43264。我想把它重新塑造成一个数组208*208,但是是成块的26*26 [[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10,11,12,13,14,15,16,17,18,19]] 变得像: [[0, 1, 2, 3, 4], [10,11,12,13,14], [ 5, 6, 7, 8, 9], [15,16,17,18,19]] 有点难看,但这里有一个小示例的一行代码,您应该能够修改为全尺寸的一行代码: In [29]: fr

我有一个数字数组,其形状是
26*43264
。我想把它重新塑造成一个数组
208*208
,但是是成块的
26*26

[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10,11,12,13,14,15,16,17,18,19]]
变得像:

[[0, 1, 2, 3, 4],
[10,11,12,13,14],
[ 5, 6, 7, 8, 9],
[15,16,17,18,19]]

有点难看,但这里有一个小示例的一行代码,您应该能够修改为全尺寸的一行代码:

In [29]: from itertools import chain

In [30]: np.array(list(chain(*[np.arange(20).reshape(4,5)[i::2] for i in xrange(2)])))
Out[30]:
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14],
       [ 5,  6,  7,  8,  9],
       [15, 16, 17, 18, 19]])
编辑:这里有一个更通用的函数版本。更难看的代码,但该函数只需要一个数组和一些您希望最终得到的片段

In [57]: def break_arr(arr, chunks):
   ....:     to_take = arr.shape[1]/chunks
   ....:     return np.array(list(chain(*[arr.take(xrange(x*to_take, x*to_take+to_take), axis=1) for x in xrange(chunks)])))
   ....:

In [58]: arr = np.arange(40).reshape(4,10)

In [59]: break_arr(arr, 5)
Out[59]:
array([[ 0,  1],
       [10, 11],
       [20, 21],
       [30, 31],
       [ 2,  3],
       [12, 13],
       [22, 23],
       [32, 33],
       [ 4,  5],
       [14, 15],
       [24, 25],
       [34, 35],
       [ 6,  7],
       [16, 17],
       [26, 27],
       [36, 37],
       [ 8,  9],
       [18, 19],
       [28, 29],
       [38, 39]])

In [60]: break_arr(arr, 2)
Out[60]:
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14],
       [20, 21, 22, 23, 24],
       [30, 31, 32, 33, 34],
       [ 5,  6,  7,  8,  9],
       [15, 16, 17, 18, 19],
       [25, 26, 27, 28, 29],
       [35, 36, 37, 38, 39]])

这种重塑问题以前也曾出现过。但我不会搜索,而是会很快演示一种numpy方法

制作示例阵列:

In [473]: x=np.arange(20).reshape(2,10)
In [474]: x
Out[474]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])
使用“重塑”将其拆分为5个块

In [475]: x.reshape(2,2,5)
Out[475]: 
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9]],

       [[10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]]])
并使用转置对维度重新排序,实际上是对这些行重新排序

In [476]: x.reshape(2,2,5).transpose(1,0,2)
Out[476]: 
array([[[ 0,  1,  2,  3,  4],
        [10, 11, 12, 13, 14]],

       [[ 5,  6,  7,  8,  9],
        [15, 16, 17, 18, 19]]])
和另一个形状来巩固前两个维度

In [477]: x.reshape(2,2,5).transpose(1,0,2).reshape(4,5)
Out[477]: 
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14],
       [ 5,  6,  7,  8,  9],
       [15, 16, 17, 18, 19]])

如果
x
已经是一个numpy数组,那么这些转置和重塑操作的成本很低(时间方面)。如果
x
是真正的嵌套列表,那么另一种具有列表操作的解决方案会更快,因为生成numpy数组会有开销。

因为
43264=208*208
你可以将数组重新塑造成
26*208*208
的形状,但不是
208*208*26*26
你只是在寻找
np.重新塑造(列表,(4,5))
?仅仅进行np.RESOUPT(列表,(4,5))是不起作用的,因为它对数据进行了错误的分段。那么如何调整它以适用于更大的整数数组呢?