numpy array轉置與兩個array合並


我們知道,用 .T 或者 .transpose() 都可以將一個矩陣進行轉置。

但是一維數組轉置的時候有個坑,光transpose沒有用,需要指定shape參數,

在array中,當維數>=2,時這個成立,但=1時,就不成立了,如:

In [7]: y
Out[7]: array([0, 0, 0, 0, 0])

In [14]: y.T
Out[14]: array([0, 0, 0, 0, 0])

In [15]: y.transpose()
Out[15]: array([0, 0, 0, 0, 0])

這個時候我們得用 .reshape() 來指定維度大小從而轉置:

In [17]: y.reshape([5,1])
Out[17]:
array([[0],
       [0],
       [0],
       [0],
       [0]])

我們再寫一個通用的轉置方法:

In [21]: y.reshape([y.shape[0],1])
Out[21]:
array([[0],
       [0],
       [0],
       [0],
       [0]])

注意, y.T 之后也不是一個簡單的一維數組,而是一個shape為(1, y.shape[0])的二維數組:

In [26]: y.T
Out[26]: array([[0, 0, 0, 0, 0]])

In [27]: y.shape
Out[27]: (5L, 1L)

或者是還有如下寫法:對一維數組通過 .reshape(1, -1).T 

In [44]: yt
Out[44]: array([0, 0, 0, 0, 0])

In [45]: yt.reshape(1, -1)
Out[45]: array([[0, 0, 0, 0, 0]])

In [46]: yt.reshape(1, -1).T
Out[46]:
array([[0],
       [0],
       [0],
       [0],
       [0]])

---------------------------------------------------------------合並-----------------------------------------------------------------

In [5]: x
Out[5]:
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2]])

 

現在我們對x,y左右合並: x|y

In [25]: np.hstack((x, y))  # 合並array, 水平方向
# 保證兩者長度(上到下)相等
Out[25]:
array([[ 5.1,  3.5,  1.4,  0.2,  0. ],
       [ 4.9,  3. ,  1.4,  0.2,  0. ],
       [ 4.7,  3.2,  1.3,  0.2,  0. ],
       [ 4.6,  3.1,  1.5,  0.2,  0. ],
       [ 5. ,  3.6,  1.4,  0.2,  0. ]])

 

 

x,y上下合並

In [51]: y.T[0,:4]  # 這里這個只是我引入的一個中間量確保他們的長度相同
Out[51]: array([0, 0, 0, 0])
In [37]: np.vstack((x, y.T[0,:4]))  # 這里要保證兩者長度(左到右)相等
Out[37]:
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2],
       [ 0. ,  0. ,  0. ,  0. ]])

 

然后numpy提供了numpy.concatenate((a1,a2,...), axis=0)函數。能夠一次完成多個數組的拼接。其中a1,a2,...是數組類型的參數

但是用 np.concatenate((x, y.T[0,:4]),axis=0) 則會報錯,原因是y.T[0,:4]的維度為(4, )

如果將

In [57]: y.T[0,:4].reshape(1,y.T[0,:4].shape[0])  # 變成(1, 4)
Out[57]: array([[0, 0, 0, 0]])

上面那個我就懶得引入中間變量了,就這樣直接寫入

In [59]: np.concatenate((x, y.T[0,:4].reshape(1,y.T[0,:4].shape[0])),axis=0)
Out[59]:
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2],
       [ 0. ,  0. ,  0. ,  0. ]])

可以看到拼接成功,即(a, b)的shape一定要滿足(am, an) (bm, bn) 中an=bn 

而對於axis=1(左右拼接),則shape一定要滿足(am, an) (bm, bn) 中am=bm

In [61]: x
Out[61]:
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2]])

In [62]: y
Out[62]:
array([[0],
       [0],
       [0],
       [0],
       [0]])

In [63]: np.concatenate((x, y),axis=1)
Out[63]:
array([[ 5.1,  3.5,  1.4,  0.2,  0. ],
       [ 4.9,  3. ,  1.4,  0.2,  0. ],
       [ 4.7,  3.2,  1.3,  0.2,  0. ],
       [ 4.6,  3.1,  1.5,  0.2,  0. ],
       [ 5. ,  3.6,  1.4,  0.2,  0. ]])

In [64]: x.shape,y.shape
Out[64]: ((5L, 4L), (5L, 1L))

 

 

 

 

然后這篇文章講的也不錯:  http://blog.csdn.net/pipisorry/article/details/39496831

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM