关于np.meshgrid函数中的indexing参数问题

 更新时间:2024年09月13日 09:49:58   作者:勤奋的大熊猫  
Meshgrid函数在二维与三维空间中用于生成坐标网格,便于进行图像处理和空间数据分析,二维情况下,默认使用笛卡尔坐标系,而三维meshgrid则涉及不同的坐标轴取法,在三维情况下,可能会出现坐标轴排列序混乱

meshgrid函数在二维空间中可以简单地理解为将x轴与y轴的每个位置的坐标关联起来形成了一个网格,我们知道空间中的点是由坐标确定的,因此,当x与y关联起来后,我们便可以给与某个点某个特定值并画出对应的图像。

具体的可以百度一下,会有很多较为详细的介绍。

这里我想要着重的说一下二维以及三维的meshgrid的参数indexing的问题。

二维meshgrid函数

import numpy as np


class Debug:
    def __init__(self):
        self.x = np.arange(5)
        self.y = np.arange(5)
        
    def grid(self):
        X, Y = np.meshgrid(self.x, self.y, indexing="xy")
        return X, Y
    

main = Debug()
X, Y = main.grid()
print("The X grid is:")
print(X)
print("The Y grid is:")
print(Y)
"""
The X grid is:
[[0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]]
The Y grid is:
[[0 0 0 0 0]
 [1 1 1 1 1]
 [2 2 2 2 2]
 [3 3 3 3 3]
 [4 4 4 4 4]]
"""

从上面的结果可以看出,所获取的网格对应如下图所示,横向为x轴,纵向为y轴,类似于我们在几何空间中使用的坐标系, 我们通常称之为笛卡尔坐标系(Cartesian coordinate)。

在二维meshgrid网格创建命令中,笛卡尔坐标系是默认的坐标系。

然而在python编程中,还有一种较为常用的indexing取法,代码如下:

import numpy as np


class Debug:
    def __init__(self):
        self.x = np.arange(5)
        self.y = np.arange(5)
        
    def grid(self):
        X, Y = np.meshgrid(self.x, self.y, indexing="ij")
        return X, Y
    

main = Debug()
i, j = main.grid()
print("The i grid is:")
print(i)
print("The j grid is:")
print(j)
"""
The i grid is:
[[0 0 0 0 0]
 [1 1 1 1 1]
 [2 2 2 2 2]
 [3 3 3 3 3]
 [4 4 4 4 4]]
The j grid is:
[[0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]]
"""

此时从上面的结果我们可以看出,所获取的网格对应如下图所示,纵向为i轴,横向为j轴,我们在编程中通常很少使用的这种坐标系。但是它也有自己的优势,这里不进一步说明。

三维meshgrid函数

进一步我们讨论三维的情况,代码如下:

import numpy as np


class Debug:
    def __init__(self):
        self.x = np.arange(3)
        self.y = np.arange(3)
        self.z = np.arange(3)
        
    def grid(self):
        X, Y, Z = np.meshgrid(self.x, self.y, self.z)
        return X, Y, Z
    

main = Debug()
X, Y, Z = main.grid()
print("The X grid is:")
print(X)
print("The Y grid is:")
print(Y)
print("The Z grid is:")
print(Z)
"""
The X grid is:
[[[0 0 0]
  [1 1 1]
  [2 2 2]]

 [[0 0 0]
  [1 1 1]
  [2 2 2]]

 [[0 0 0]
  [1 1 1]
  [2 2 2]]]
The Y grid is:
[[[0 0 0]
  [0 0 0]
  [0 0 0]]

 [[1 1 1]
  [1 1 1]
  [1 1 1]]

 [[2 2 2]
  [2 2 2]
  [2 2 2]]]
The Z grid is:
[[[0 1 2]
  [0 1 2]
  [0 1 2]]

 [[0 1 2]
  [0 1 2]
  [0 1 2]]

 [[0 1 2]
  [0 1 2]
  [0 1 2]]]
"""

由上面的结果我们可以看到,此时的坐标轴对应如下图像:

x轴向下,y轴向屏幕内侧,z轴向右侧,在三维图像中不再根据indexing值来区分坐标轴了,而是统一规定了坐标轴的取法,只有对于这个坐标轴的取法深入理解,才能在之后的三维数据处理中游刃有余。

特别说明

但是这里有一个问题,来看一组代码:

class Debug:
    def __init__(self):
        x = np.array([[[0],
                       [2]], [[4],
                              [6]], [[8],
                                     [10]]])
        print(x.shape)


main = Debug()
"""
(3, 2, 1)
"""

我们可以看到,输出结果为(3, 2, 1),即沿着x1个元素,沿着y2个元素,沿着z3个元素。

再来看一下我们使用meshgrid方法生成三维网格的情况。

import numpy as np


class Debug:
    def __init__(self):
        self.x = np.arange(1)
        self.y = np.arange(2)
        self.z = np.arange(3)

    def grid(self):
        X, Y, Z = np.meshgrid(self.x, self.y, self.z)
        return X, Y, Z


main = Debug()
X, Y, Z = main.grid()
print("The X grid is:")
print(X.shape)
print("The Y grid is:")
print(Y.shape)
print("The Z grid is:")
print(Z.shape)
"""
The X grid is:
(2, 1, 3)
The Y grid is:
(2, 1, 3)
The Z grid is:
(2, 1, 3)
"""

我们可以看到,最终输出的X,Y,Zshape均为(2, 1, 3),这对应的是沿着x3个元素,沿着y1个元素,沿着z2个元素。

突然感觉有些混乱,不符合我们之前想要得到的x,y,z的排列顺序,为了能够得到正常的排列顺序,我们可以使用如下代码:

import numpy as np


class Debug:
    def __init__(self):
        self.x = np.arange(1)
        self.y = np.arange(2)
        self.z = np.arange(3)

    def grid(self):
        X, Y, Z = np.meshgrid(self.y, self.z, self.x)
        return X, Y, Z


main = Debug()
X, Y, Z = main.grid()
print("The X grid is:")
print(X.shape)
print("The Y grid is:")
print(Y.shape)
print("The Z grid is:")
print(Z.shape)
"""
The X grid is:
(3, 2, 1)
The Y grid is:
(3, 2, 1)
The Z grid is:
(3, 2, 1)
"""

可以看到运行后我们得到了符合Python默认坐标轴习惯的网格形式,这时对应的x轴向右侧,y轴向下,z轴向屏幕里面。

这个仅仅是为了理解需要,实际操作中无需进行这种坐标轴变换操作,直接使用默认的三维坐标轴方向即可。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • django之常用命令详解

    django之常用命令详解

    下面小编就为大家带来一篇django之常用命令详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Python中内置的数据结构类型详解(内置数据容器)

    Python中内置的数据结构类型详解(内置数据容器)

    在 Python 中,字典(dict)是一种非常常用的数据结构,用于存储键值对,这篇文章给大家介绍Python中内置的数据结构类型详解(内置数据容器),感兴趣的朋友一起看看吧
    2025-04-04
  • 一些让Python代码简洁的实用技巧总结

    一些让Python代码简洁的实用技巧总结

    随着项目代码行数的增加,不可避免的遇到软件架构腐败的问题,所以如何写出简洁的代码至关重要,这篇文章主要给大家介绍了一些让Python代码简洁的实用技巧,需要的朋友可以参考下
    2021-08-08
  • 图文详解python安装Scrapy框架步骤

    图文详解python安装Scrapy框架步骤

    在本篇内容中我们给大家整理了关于python安装Scrapy框架的图文详细步骤,需要的朋友们跟着学习下。
    2019-05-05
  • 数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法

    数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法

    今天小编就为大家分享一篇数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python 解码Base64 得到码流格式文本实例

    Python 解码Base64 得到码流格式文本实例

    今天小编就为大家分享一篇Python 解码Base64 得到码流格式文本实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python Vaex实现快速分析100G大数据量

    Python Vaex实现快速分析100G大数据量

    Vaex是一个开源的DataFrame库,它可以对表格数据集进行可视化、探索、分析,甚至机器学习,这些数据集和你的硬盘驱动器一样大。本文就来聊聊如何利用Vaex实现快速分析100G大数据量,需要的可以参考一下
    2023-03-03
  • 详解Python中matplotlib模块的绘图方式

    详解Python中matplotlib模块的绘图方式

    Matplotlib是Python中最受欢迎的数据可视化软件包之一,它是 Python常用的2D绘图库,同时它也提供了一部分3D绘图接口。本文将详细介绍Matplotlib的绘图方式,需要的可以参考一下
    2022-07-07
  • python实现春晚魔术的示例代码

    python实现春晚魔术的示例代码

    本文主要介绍了python实现春晚魔术的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • python list转矩阵的实例讲解

    python list转矩阵的实例讲解

    今天小编就为大家分享一篇python list转矩阵的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08

最新评论