2015-10-19 99 views
1

我想重新塑造numpy数组,如图所示,从3D到2D。不幸的是,订单不正确。Python重塑3d数组到2d

A假定有一个numpy数组(1024,64,100)并且想要将其转换为(1024 * 100,64)。

有没有人有想法如何维持秩序?

Image - click here

我有一个样本数据

data[0,0,0]=1 
data[0,1,0]=2 
data[0,2,0]=3 
data[0,3,0]=4 
data[1,0,0]=5 
data[1,1,0]=6 
data[1,2,0]=7 
data[1,3,0]=8 
data[2,0,0]=9 
data[2,1,0]=10 
data[2,2,0]=11 
data[2,3,0]=12 
data[0,0,1]=20 
data[0,1,1]=21 
data[0,2,1]=22 
data[0,3,1]=23 
data[1,0,1]=24 
data[1,1,1]=25 
data[1,2,1]=26 
data[1,3,1]=27 
data[2,0,1]=28 
data[2,1,1]=29 
data[2,2,1]=30 
data[2,3,1]=31 

和我想有一个这样的结果:

array([[ 1., 2., 3., 4.], 
     [ 5., 6., 7., 8.], 
     [ 9., 10., 11., 12.], 
     [ 20., 21., 22., 23.], 
     [ 24., 25., 26., 27.], 
     [ 28., 29., 30., 31.]]) 

而且,我还希望有以另一种方式重塑,即从:

array([[ 1., 2., 3., 4.], 
     [ 5., 6., 7., 8.], 
     [ 9., 10., 11., 12.], 
     [ 20., 21., 22., 23.], 
     [ 24., 25., 26., 27.], 
     [ 28., 29., 30., 31.]]) 

到所需的输出:

[[[ 1. 20.] 
    [ 2. 21.] 
    [ 3. 22.] 
    [ 4. 23.]] 

[[ 5. 24.] 
    [ 6. 25.] 
    [ 7. 26.] 
    [ 8. 27.]] 

[[ 9. 28.] 
    [ 10. 29.] 
    [ 11. 30.] 
    [ 12. 31.]]] 

回答

7

看起来你可以使用numpy.transpose,然后重塑,像这样 -

data.transpose(2,0,1).reshape(-1,data.shape[1]) 

采样运行 -

In [63]: data 
Out[63]: 
array([[[ 1., 20.], 
     [ 2., 21.], 
     [ 3., 22.], 
     [ 4., 23.]], 

     [[ 5., 24.], 
     [ 6., 25.], 
     [ 7., 26.], 
     [ 8., 27.]], 

     [[ 9., 28.], 
     [ 10., 29.], 
     [ 11., 30.], 
     [ 12., 31.]]]) 

In [64]: data.shape 
Out[64]: (3, 4, 2) 

In [65]: data.transpose(2,0,1).reshape(-1,data.shape[1]) 
Out[65]: 
array([[ 1., 2., 3., 4.], 
     [ 5., 6., 7., 8.], 
     [ 9., 10., 11., 12.], 
     [ 20., 21., 22., 23.], 
     [ 24., 25., 26., 27.], 
     [ 28., 29., 30., 31.]]) 

In [66]: data.transpose(2,0,1).reshape(-1,data.shape[1]).shape 
Out[66]: (6, 4) 

要取回原始3D阵列,使用reshape,然后使用numpy.transpose,像这样 -

In [70]: data2D.reshape(np.roll(data.shape,1)).transpose(1,2,0) 
Out[70]: 
array([[[ 1., 20.], 
     [ 2., 21.], 
     [ 3., 22.], 
     [ 4., 23.]], 

     [[ 5., 24.], 
     [ 6., 25.], 
     [ 7., 26.], 
     [ 8., 27.]], 

     [[ 9., 28.], 
     [ 10., 29.], 
     [ 11., 30.], 
     [ 12., 31.]]]) 
+0

@pallago请查看编辑。 – Divakar

+0

刚发现这个问题不小心,看到了答案的第一行,并猜测作者;)感谢提示! –

+0

@AndrasDeak你在寻找旧的NumPy问题时徘徊,因为你太无聊了? :) – Divakar