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

问题描述 投票:0回答:3

我有一个像这样的 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
ing(和/或
vstack
ing)它们或添加额外的维度和重塑的情况下进行?

python arrays numpy multidimensional-array numpy-ndarray
3个回答
44
投票
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]])

我在这里发布了更通用的函数,用于将数组重新整形/取消整形为块,


0
投票
将 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)

result1


从表面上看,它与

swapaxes()

 执行相同的工作,但由于 
transpose()
 允许轴的任何排列,因此它更加灵活。例如,要进行以下转换,必须交换两个轴,因此 
swapaxes()
 必须调用两次,但可以通过单个 
transpose()
 调用来处理。

result2

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

0
投票
使用 Einsum :

import numpy as np # Original 3D array a = np.arange(16).reshape((4, 2, 2)) print(a) ''' [[[ 0 1] [ 2 3]] [[ 4 5] [ 6 7]] [[ 8 9] [10 11]] [[12 13] [14 15]]] ''' using_einsum = np.einsum('abcd -> acbd',a.reshape(2,2,2,2)).reshape(4,4) print(using_einsum) ''' [[ 0 1 4 5] [ 2 3 6 7] [ 8 9 12 13] [10 11 14 15]] '''
    
© www.soinside.com 2019 - 2024. All rights reserved.