zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    VS2010开发工具使用技巧<之简单讲解>
    JS中的数学计算<之简单实例讲解>
    让DIV中文字换行显示
    VS2010编写WebService与在IIS的发布<之简单讲解>
    JSON.parse 与 eval() 对于解析json的问题
    [字符串]与[数组]的互相转换
    A标签实现文件下载功能
    "Chinese_PRC_CI_AS" 和 "Chinese_PRC_90_CI_AI" 之间的排序规则冲突问题
    IE开发人员工具之实用功能讲解
    CSS选择器 < ~ +
  • 原文地址:https://www.cnblogs.com/cymwill/p/8358866.html
Copyright © 2011-2022 走看看