如何将3d numpy数组转换为2d

uwopmtnx  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(134)

我有一个像这样的3D矩阵

np.arange(16).reshape((4,2,2))

array([[[ 0,  1],
        [ 2,  3]],

        [[ 4,  5],
        [ 6,  7]],

        [[ 8,  9],
        [10, 11]],

        [[12, 13],
        [14, 15]]])

并希望将它们以网格格式堆叠,最后得到

array([[ 0,  1,  4,  5],
       [ 2,  3,  6,  7],
       [ 8,  9, 12, 13],
       [10, 11, 14, 15]])

有没有一种方法可以不显式地对它们进行hstack(和/或vstack),或者添加额外的维度和重塑?

pftdvrlh

pftdvrlh1#

In [27]: x = np.arange(16).reshape((4,2,2))

In [28]: x.reshape(2,2,2,2).swapaxes(1,2).reshape(4,-1)
Out[28]: 
array([[ 0,  1,  4,  5],
       [ 2,  3,  6,  7],
       [ 8,  9, 12, 13],
       [10, 11, 14, 15]])

我已经发布了reshaping/unshaping arrays into blocks, here的更多通用函数。

7fhtutme

7fhtutme2#

将3d数组转换为2d数组,transpose()是一个非常有用的函数。例如,为了在OP中导出预期结果,在通过添加额外维度进行整形之后,可以使用transpose()交换第二轴和第三轴。

arr = np.arange(16).reshape(4,2,2)
reshaped_arr = arr.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,-1)

从表面上看,它和swapaxes()的工作一样,但因为transpose()允许任意轴的排列,所以它更灵活。例如,要进行以下转换,必须交换两个轴,因此swapaxes()必须调用两次,但可以通过一次transpose()调用来处理。

reshaped_arr = arr.reshape(2,2,2,2).transpose(1,2,0,3).reshape(4,-1)

相关问题