2016-12-24 156 views
1

我有一个数组,它是形状的(5,2,1)整形numpy的阵列到2D

array([[[-0.00047776], 
    [-0.00065181]], 

    [[-0.00065181], 
    [ 0.00130446]], 

    [[ 0.00130446], 
    [ 0.00151989]], 

    [[ 0.00151989], 
    [ 0.00121407]], 

    [[ 0.00121407], 
    [-0.00121259]]], dtype=float32) 

我想将其转换为形状(2,5,1)这样

 array([ 

       [[-0.00047776], [-0.00065181], [ 0.00130446], [ 0.00151989], [ 0.00121407]], 
       [[-0.00065181], [ 0.00130446], [ 0.00151989], [ 0.00121407], [-0.00121259]] 


      ]) 

感谢

回答

3

每个NumPy的阵列具有天然的1D为了它的项目。这是您在 ravel 阵列中看到的 的顺序。重新整形(使用默认顺序='C')不会更改数组中项目的顺序 。因此,x.reshape(shape)x.ravel().reshape(shape)相同。这里的关键外带消息是,当且仅当y.ravel()等于x.ravel()阵列 y是“可到达的”,通过重塑x

因此考虑的项目的弄清(1维)的顺序给定的阵列和所需的阵列中:

In [21]: x = np.array([[[-0.00047776], [-0.00065181]], [[-0.00065181], [ 0.00130446]], [[ 0.00130446], [ 0.00151989]], [[ 0.00151989], [ 0.00121407]], [[ 0.00121407], [-0.00121259]]], dtype=np.float32); x.ravel() 
Out[21]: 
array([-0.00047776, -0.00065181, -0.00065181, 0.00130446, 0.00130446, 
     0.00151989, 0.00151989, 0.00121407, 0.00121407, -0.00121259], dtype=float32) 

In [22]: y = np.array([ [[-0.00047776], [-0.00065181], [ 0.00130446], [ 0.00151989], [ 0.00121407]], [[-0.00065181], [ 0.00130446], [ 0.00151989], [ 0.00121407], [-0.00121259]] ]); y.ravel() 
Out[22]: 
array([-0.00047776, -0.00065181, 0.00130446, 0.00151989, 0.00121407, 
     -0.00065181, 0.00130446, 0.00151989, 0.00121407, -0.00121259]) 

注意,项目顺序是不同的。因此,要实现所需的阵列,您必须首先(不知何故)重新排序x中的项目。在这种情况下using swapaxes以交换第一和第二轴线的伎俩:

In [23]: x.swapaxes(0,1) 
Out[25]: 
array([[[-0.00047776], 
     [-0.00065181], 
     [ 0.00130446], 
     [ 0.00151989], 
     [ 0.00121407]], 

     [[-0.00065181], 
     [ 0.00130446], 
     [ 0.00151989], 
     [ 0.00121407], 
     [-0.00121259]]], dtype=float32) 

In [26]: np.allclose(x.swapaxes(0,1), y) 
Out[26]: True 

否重塑是必要的,因为x.swapaxes(0,1)已经具有形状(2,5,1)。

+0

很好的答案,并解释了很多。我很感激。 – Amer