我們知道,用 .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