zoukankan      html  css  js  c++  java
  • 关于meshgrid和numpy.c_以及numpy.r_

      meshgrid的目的是生成两套行列数一致的矩阵,其中一个是行重复,一个是列复制;可以这么来理解,通过ravel()将矩阵数据拉平之后,就可以将这两套矩阵累加在一起,形成一个两行数据,要达到这个效果是需要行列相同,这样就能够理解meshgrid行为了。
      比如下面的数据,是原始的两个数组:
      t01: array([1., 2., 3.])
      t02: array([4., 5.])
      经过了一些meshgrid的处理之后,形成了两个矩阵:
      ++++++++++++ t1 ++++++++++++
      array([[1., 2., 3.],
      [1., 2., 3.]])
      ++++++++++++ t2 ++++++++++++
      array([[4., 4., 4.],
      [5., 5., 5.]])
      那么为什么需要meshgrid呢?目的就是为下面的num.c_和numpy.r_操作做准备(至少很多时候是这样的)。前者用于将数据进行纵切(多用于生成二元组,比如坐标等),后者用于将数据拉成一行。
      继续我们刚才的数据:
      在进行numpy的c_和p_之前要通过ravel进行拉平(和flatten功能类似)。
      ++++++++++++t1.ravel()++++++++++++
      array([1., 2., 3., 1., 2., 3.])
      ++++++++++++t2.ravel()++++++++++++
      array([4., 4., 4., 5., 5., 5.])
      观察一下np.c_的处理结果,你会发现其实就是将拉平为两行的数据,进行纵切,将纵切的每列元素进行合并:
      ++++++++++++np.c_[t1.ravel(), t2.ravel()]++++++++++++
      array([[1., 4.],
      [2., 4.],
      [3., 4.],
      [1., 5.],
      [2., 5.],
      [3., 5.]])
      下面是np.r_的操作,其实就是将两个矩阵,进行横切,然后合并(合并为一行了)。

      其实,并不这么简单,其实如果你再一次看一下数据的组合,你会发现,这两组数据各自组合了一次,1和4,5组合了,2和4,5组合,3和4,5组合;所有的数据之间都进行组合;meshgrid很多的场景都是用在获取整个平面均匀的点,一般都是通过np.linspace来搞定的X轴,y轴均匀的点;然后对于这些点利用meshgrid,np.c_以及ravel函数,是的这些点之间形成各种组合,获取一个比较全面的点集,点集覆盖了整个平面;


      ++++++++++++np.r_[t1.ravel(), t2.ravel()]++++++++++++
      [1. 2. 3. 1. 2. 3. 4. 4. 4. 5. 5. 5.]
      还有稍微复杂一些的情况,如果你操作的直接就是向量,要注意,你操作的是向量,一组数据作为一个元素:
      ++++++++++++np.c_[np.array([[1,2,3]]), np.array([[4,5,6]])]++++++++++++
      [[1 2 3 4 5 6]]
      结果是对的,因为还是纵切,但是切出了还是纵向的两个元素[[123]],[[456]],然后进行合并于是有了[[123456]]。
      关于c_:
      ++++++++++++np.r_[np.array([[1,2,3]]), np.array([[4,5,6]])]++++++++++++
      [[1 2 3]
      [4 5 6]]

      代码如下:
      

     1 t01 = np.linspace(1, 3, 3)
     2 t02 = np.linspace(4, 5, 2)
     3 pprint(t01)
     4 pprint(t02)
     5 
     6 t1, t2= np.meshgrid(t01, t02)
     7 print("++++++++++++ t1 ++++++++++++")
     8 pprint(t1)
     9 print("++++++++++++ t2 ++++++++++++")
    10 pprint(t2)
    11 
    12 t = np.c_[t1.ravel(), t2.ravel()]
    13 print("++++++++++++t1.ravel()++++++++++++")
    14 pprint(t1.ravel())
    15 print("++++++++++++t2.ravel()++++++++++++")
    16 pprint(t2.ravel())
    17 print("++++++++++++np.c_[t1.ravel(), t2.ravel()]++++++++++++")
    18 pprint(t)
    19 
    20 print('++++++++++++np.r_[t1.ravel(), t2.ravel()]++++++++++++')
    21 t3=np.r_[t1.ravel(), t2.ravel()]
    22 print(t3)
    23 
    24 t4 = np.c_[np.array([[1,2,3]]), np.array([[4,5,6]])]
    25 print('++++++++++++np.c_[np.array([[1,2,3]]), np.array([[4,5,6]])]++++++++++++')
    26 print(t4)
    27 
    28 t5 = np.r_[np.array([[1,2,3]]), np.array([[4,5,6]])]
    29 print('++++++++++++np.r_[np.array([[1,2,3]]), np.array([[4,5,6]])]++++++++++++')
    30 print(t5)

    输出:
    array([1., 2., 3.])
    array([4., 5.])
    ++++++++++++ t1 ++++++++++++
    array([[1., 2., 3.],
    [1., 2., 3.]])
    ++++++++++++ t2 ++++++++++++
    array([[4., 4., 4.],
    [5., 5., 5.]])
    ++++++++++++t1.ravel()++++++++++++
    array([1., 2., 3., 1., 2., 3.])
    ++++++++++++t2.ravel()++++++++++++
    array([4., 4., 4., 5., 5., 5.])
    ++++++++++++np.c_[t1.ravel(), t2.ravel()]++++++++++++
    array([[1., 4.],
    [2., 4.],
    [3., 4.],
    [1., 5.],
    [2., 5.],
    [3., 5.]])
    ++++++++++++np.r_[t1.ravel(), t2.ravel()]++++++++++++
    [1. 2. 3. 1. 2. 3. 4. 4. 4. 5. 5. 5.]

    ++++++++++++np.c_[np.array([[1,2,3]]), np.array([[4,5,6]])]++++++++++++
    [[1 2 3 4 5 6]]
    ++++++++++++np.r_[np.array([[1,2,3]]), np.array([[4,5,6]])]++++++++++++
    [[1 2 3]
    [4 5 6]]

  • 相关阅读:
    搭建 structs2 环境
    数据库基础
    好书推荐整理
    Java 完美判断中文字符
    中文在unicode中的编码范围
    [转载]爬虫的自我解剖(抓取网页HtmlUnit)
    web应用配置
    简单的Java Web服务器
    dos基本命令
    Unrecognized Windows Sockets error: 0: JVM_Bind
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/9787534.html
Copyright © 2011-2022 走看看