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

原文地址:https://www.cnblogs.com/cymwill/p/8358866.html