沿特定轴沿着“重塑”- Numpy

wgeznvg7  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(135)

我有一个4D numpy数组。例如,我有两批3个二维矩阵,形状为(2,3,4,5)。在每批中,我想水平连接三个二维矩阵(在最后一个维度上)。
输出形状应为(2,4,5 * 3)形状。
一个较小的例子,用于复制形状(2,3,2,2):

a1, a2, a3, a4 = 2, 3, 2, 2
arr = np.arange(a1*a2*a3*a4).reshape((a1, a2, a3, a4))

[[[[ 0  1]
   [ 2  3]]

  [[ 4  5]
   [ 6  7]]

  [[ 8  9]
   [10 11]]]

 [[[12 13]
   [14 15]]

  [[16 17]
   [18 19]]

  [[20 21]
   [22 23]]]]

字符串
它的第一行(如果检查最后一个维度)应该是:[0, 1, 4, 5, 8, 9]
先谢了。

s4chpxco

s4chpxco1#

虽然可以使用某种形式的concatenate,但transpose通常适用于这类问题:

In [532]: arr.transpose(0,2,1,3).reshape(2,2,6)
Out[532]: 
array([[[ 0,  1,  4,  5,  8,  9],
        [ 2,  3,  6,  7, 10, 11]],

       [[12, 13, 16, 17, 20, 21],
        [14, 15, 18, 19, 22, 23]]])

字符串
没有最后的重塑,第一条“线”是

In [533]: arr.transpose(0,2,1,3)
Out[533]: 
array([[[[ 0,  1],
         [ 4,  5],
         [ 8,  9]],


对于所有不同维度的例子

In [534]: x=np.ones((2,3,4,5))
In [535]: x.transpose(0,2,1,3).shape
Out[535]: (2, 4, 3, 5)
In [536]: x.transpose(0,2,1,3).reshape(2,4,3*5).shape
Out[536]: (2, 4, 15)


有时候,计算转置需要一些反复试验,但是这里你想保持第一维不变,最后一个也是,所以我们只需要交换中间的两个。
转置本身生成一个视图,但是最后一次整形必须生成一个副本,因为它重新排序了“散乱”的值。

smdnsysy

smdnsysy2#

使用加倍的np.hstack(通过所有矩阵收集水平行)并返回到np.reshape的等效形状:

new_arr = np.hstack(np.hstack(arr)).reshape(arr.shape[0], arr.shape[2], -1)
array([[[ 0,  1,  4,  5,  8,  9],
        [ 2,  3,  6,  7, 10, 11]],

       [[12, 13, 16, 17, 20, 21],
        [14, 15, 18, 19, 22, 23]]])
new_arr.shape
(2, 2, 6)
jrcvhitl

jrcvhitl3#

尽管使用了列表解析,但这并没有创建一个中间数组,而且与Roman的答案相比,这是一个更快的选择(至少在我使用不同大小和形状运行的实验中是这样):

np.concatenate([arr[:, :, i] for i in range(arr.shape[2])]).reshape(arr.shape[0], arr.shape[2], -1)

字符串

相关问题