2016-12-24 154 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