• 【Python】Numpy生成坐标网格


    Numpy基础:数学计算🔥 逻辑运算

    meshgrid

    在三维图的绘制过程中,一般需要 x , y , z x,y,z x,y,z之间的对应关系,但对于图像而言,其 x , y x,y x,y轴坐标是体现在像素栅格中的,从而图像矩阵中的像素强度,其实表示的是 z z z轴的坐标,这种情况下如果想绘制三维散点图,就需要生成图像像素对应的坐标网格。

    Numpy中,最常用的坐标网格生成函数,就是meshgrid,其用法可参考下面的示例

    x = [0,1,2,3,4]
    y = [0,1,2,3]
    xv, yv = np.meshgrid(x, y)
    print(xv)
    '''
    [[0 1 2 3 4]
     [0 1 2 3 4]
     [0 1 2 3 4]
     [0 1 2 3 4]]
    '''
    print(yv)
    '''
    [[0 0 0 0 0]
     [1 1 1 1 1]
     [2 2 2 2 2]
     [3 3 3 3 3]]
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    即xv为

    [ 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 ] [01234012340123401234] 00001111222233334444

    而yv为

    [ 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 ] [00000111112222233333] 01230123012301230123

    直观地说,就是对输入的 x , y x,y x,y变量,分别向 y y y轴和 x x x轴方向进行了扩张。

    mgrid和ogrid

    mgrid是比meshgrid更加简单的一种数据结构,其特点是直接通过魔法函数实现了坐标网格的生成。

    >>> xv, yv = np.mgrid[0:2, 2:5]
    >>> print(xv)
    [[0 0 0]
     [1 1 1]]
    >>> print(yv)
    [[2 3 4]
     [2 3 4]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    当然,这个维度可以是任意的,而且步长也可以是任意的,

    >>> np.mgrid[1:5]
    array([1, 2, 3, 4])
    >>> np.mgrid[1:10:5]
    array([1, 6])
    >>> np.mgrid[1.1:10]
    array([1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果翻阅源码,会发现mgridMGridClass()的一个实例,MGridClass则是nd_grid的一个子类,在nd_grid中,实现了__getitem__这个魔法函数,从而达成了[]的索引方法。

    ogrid的用法与mgrid相同,二者都是nd_grid的子类,但生成的数组不同,直接看案例

    >>>ogrid[0:5,0:5]
    [array([[0],
            [1],
            [2],
            [3],
            [4]]), array([[0, 1, 2, 3, 4]])]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    indices

    如果想干脆一点,只是生成从0开始的等间隔的坐标网格,那么这里最推荐的是indices,这个函数只需输入维度,就可以完成网格的创建。

    接下来打开一张图片演示一下

    在这里插入图片描述

    import numpy as np
    import matplotlib.pyplot as plt
    img = plt.imread('test.jpg')
    ax = plt.subplot(projection='3d')
    gray = img[:,:,1]
    yMat, xMat = np.indices(gray.shape)
    ax.plot_surface(xMat, yMat, gray)
    ax.axis('off')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    效果为
    在这里插入图片描述
    最后总结一下indices, meshgird, mgrid的等价形式

    indicesindices([M,N])
    meshgridmeshgrid(np.arange(M), np.arange(N))
    mgridmgrid[:M,:N]
  • 相关阅读:
    MySQL 5与MySQL 8版本差异及MySQL 8的新功能
    设备树添加版本信息
    超详细的PMP®小白备考攻略
    最长递增子序列问题(你真的会了吗)
    SSM+校园好货APP的设计与实现 毕业设计-附源码121619
    U2-Net显著性检测源码详解
    给出含有n个整数的数组s,找出s中和加起来的和最接近给定的目标值的三个整数。返回这三个整数的和。你可以假设每个输入都只有唯一解。
    原型,原型链的理解
    Spring源码深度解析:五、BeanFactoryPostProcessor的处理
    Xilinx FPGA 7系列 GTX/GTH Transceivers (3) Aurora 8b10b
  • 原文地址:https://blog.csdn.net/m0_37816922/article/details/127877835