NumPy Meshgrid 从零到英雄

2023-10-22

Python 的 NumPy是处理数组/矩阵数据最常用的库。
矩阵可以被视为二维值“网格”,其中网格中每个值的位置由一对值 (i, j) 给出。
这些值表示该值在网格中的行号和列号。
在本教程中,我们将了解如何使用 Python 中的 NumPy 库创建此类网格并使用它们。

 

 

什么是网格?

术语“meshgrid”由两个词组成——“mesh”和“grid”,这两个词通常
指“网络”或“交错结构”或等距值的“排列”
笛卡尔坐标系就是一个典型的例子。

如图所示,每个位置由一对有序索引或 X 和 Y 坐标表示。
使用 NumPymeshgrid方法中,我们将创建这样的有序对来构造一个网格。

 

网状网格有什么好处?

网格在任何需要构建明确定义的二维甚至多维空间以及需要能够引用空间中每个位置的应用程序中都很有用。
然而,网格最突出的应用是数据可视化。为了可视化数据中的模式,或者在 2D 或 3D 空间中绘制函数,网格通过创建有序的因变量对而发挥着重要作用。
以下是使用网格网格作为中间步骤实现的数据可视化的两个示例。

第一个图显示了圆的等高线图,其半径和中心位于 (0,0)。
第二个图是 3D 高斯曲面图。
这些图使用使用生成的坐标numpy.meshgrid.

 

从两个 1D 数组创建 2D NumPy 网格

让我们从一个使用网格网格的简单示例开始。
我们想要创建一个 5×5 笛卡尔网格,x 坐标范围从 1 到 5,y 坐标范围从 11 到 15。
这意味着有序的 (x, y) 坐标对将从 (1,11) 开始一直到 (5,15)。
我们还需要单独存储网格中每个位置的 x 和 y 坐标。


X = np.array([1,2,3,4,5])
Y = np.array([11, 12, 13, 14, 15])
xx, yy = np.meshgrid(X,Y)
print("X coordinates:\n{}\n".format(xx))
print("Y coordinates:\n{}".format(yy))
  

Output:

我们得到两个 NumPy 数组作为输出,每个数组的形状为 5×5。
第一个数组表示网格中每个位置的 x 坐标,而第二个数组表示相应的 y 坐标。

如果您在两个数组中相同位置处获取有序的值对,您将获得我们预期网格中所有位置的 (x, y) 坐标。
例如,两个数组中位置[0,0]的值代表位置(1,11)。 [0,1]处的代表位置(2,11),依此类推。

 

使用稀疏 = True 创建 NumPy 网格

如果你仔细观察输出np.meshgrid在前面的示例中,第一个输出数组 xx 具有按行重复的相同一维数组,第二个输出数组 yy 具有按列重复的相同数组。

因此,要构建网格,我们只需要有关重复的一维数组及其方向的信息。

这是通过指定参数‘的值来实现的sparse' 为 '真实'
顾名思义,它返回网格的“稀疏”表示。

让我们重建相同的网格sparse=True


X = np.array([1,2,3,4,5])
Y = np.array([11, 12, 13, 14, 15])
xx, yy = np.meshgrid(X,Y, sparse=True)
print("X coordinates:\n{}\n".format(xx))
print("Y coordinates:\n{}".format(yy))
  

Output:

现在输出数组不再是 5×5 的形状。 xx 数组的形状为 1×5,yy 数组的形状为 5×1

请注意,这不会影响网格上值的任何进一步计算。
例如,如果您想计算网格值上的某个函数,您可以使用稀疏表示来执行此操作并获得 5×5 输出。
这是可能的,因为NumPy 数组的广播

 

创建极坐标的 NumPy 网格

到目前为止,我们已经了解了如何在笛卡尔坐标系中生成坐标网格。

然而,还存在另一种坐标系,称为“极坐标系”,它同样流行并且常用于各种应用中。

在这个系统中,我们使用半径 r(距原点)和角度 θ(与水平面)表示平面中的位置。

我们可以使用以下公式将笛卡尔坐标转换为极坐标,反之亦然

下图显示了同一平面上的两个坐标系,这将有助于您更好地理解它们之间的关系。

现在我们了解了极坐标系及其与笛卡尔坐标系的关系,并且由于我们已经创建了笛卡尔坐标系的网格,
让我们创建一个极坐标网格。


R = np.linspace(1,5,10)
THETA = np.linspace(0, np.pi, 45)
radii, thetas = np.meshgrid(R,THETA)
print("R:{}".format(R.shape))
print("THETA:{}".format(THETA.shape))
print("meshgrid radii:{}".format(radii.shape))
print("mehgrid thetas:{}".format(thetas.shape))
  

Output:

我们首先定义了半径的范围。它是从 1 到 5 的十个等距值。
然后,我们定义了角度的范围,从 0 到 π,或从 0° 到 180°。我们正在考虑此范围内的 45 个不同值。

然后,我们创建这些半径和角度的网格。
结果,我们得到两个矩阵,每个矩阵代表半径和角度。这两个矩阵的形状均为 45×10。

现在让我们尝试使用 pyplot 在极坐标平面上可视化这些生成的点。


import matplotlib.pyplot as plt
ax = plt.subplot(111, polar=True)
ax.plot(thetas, radii, marker='.', ls='none')
plt.show()
  

Output:

该图中绘制了 450 个点,代表由 45 个角度和 10 个半径创建的网格。

 

具有“矩阵索引”的 NumPy 网格网格

到目前为止我们观察到np.meshgrid方法返回带有笛卡尔索引的坐标
这意味着第一个数组代表列(X 坐标),第二个数组代表行(Y 坐标)。

但是,如果您考虑计算机科学中使用的二维数组或矩阵,我们会使用“行优先”索引来访问此类数组,
即第一个坐标代表行,第二个坐标代表列。这种索引称为“矩阵索引”。

我们可以通过将字符串“in”分配给参数“来生成具有矩阵索引的网格网格indexing' 的np.meshgrid method.


i = np.array([1,2,3,4,5]) #rows
j = np.array([11, 12, 13, 14, 15]) #columns
ii, jj = np.meshgrid(i,j, indexing='ij')
print("row indices:\n{}\n".format(ii))
print("column indices:\n{}".format(jj))
  

Output:

如果仔细观察,这些是之前使用默认笛卡尔 (x, y) 索引生成的数组的转置。
让我们验证这一观察。


print("ii equal to xx transposed ? ==>",np.all(ii == xx.T))
print("jj equal to yy transposed ? ==>",np.all(jj == yy.T))
  

Output:

 

翻转 NumPy 网格

一旦我们有了 x 和 y 坐标,我们就可以通过操作各个输出数组来垂直或水平翻转网格。

让我们首先创建一个包含 150 个值的网格,并将其绘制出来,以便我们可以可视化网格的翻转。


X = np.linspace(1,15,15)
Y = np.linspace(20,30,10)
xx, yy = np.meshgrid(X,Y)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(xx, yy, ls="None", marker=".")
plt.show()
  

Output:

该图包含网格中的 150 个点。每列都有相同颜色的点。

我们可以通过按列反转两个坐标数组来沿垂直轴翻转网格。


fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(xx[:,::-1], yy[:,::-1], ls="None", marker=".")
plt.show()
  

Output:

该图中的网格从上图中沿垂直轴翻转。
这通过第一列和最后一列、第二列和倒数第二列等之间点的颜色互换来表示。

 

使用 NumPy 矩阵创建网格网格

我们一直在使用一维 NumPy 数组创建网格。
但是,如果我们传递 2 维或更多维 NumPy 数组作为 x 和 y 的参数,会发生什么?

我们将使用NumPy 随机种子这样你就可以在你的计算机上获得相同的随机数。


np.random.seed(42)
a = np.random.randint(1,5, (2,2))
b = np.random.randint(6,10, (3,3))
print("a:\n{}\n".format(a))
print("b:\n{}".format(b))
xx, yy = np.meshgrid(a,b)
print("xx:\n{}".format(xx))
print("shape of xx:{}\n".format(xx.shape))
print("yy:\n{}".format(yy))
print("shape of yy:{}\n".format(yy.shape))
  

Output:

显然,无论输入参数的形状如何,只要输入数组的数量为 2,我们都会得到二维 NumPy 数组作为输出。

这相当于在创建网格之前展平输入数组。


xx, yy = np.meshgrid(a.ravel(),b.ravel()) #passing flattened arrays
print("xx:\n{}".format(xx))
print("shape of xx:{}\n".format(xx.shape))
print("yy:\n{}".format(yy))
print("shape of yy:{}\n".format(yy.shape))
  

Output:

输出与我们以原始形状传递 2D 数组来创建网格时得到的输出相同。

 

创建 3 维网格

到目前为止,我们只看到了 2D 平面中网格的构造。
通过提供 x 和 y 坐标数组,我们得到两个输出数组,每个数组对应 2D 平面中的 x 和 y 坐标。

现在让我们看看如何在 3D 空间中生成由 3 个坐标定义的网格。


X = np.linspace(1,4,4)
Y = np.linspace(6,8, 3)
Z = np.linspace(12,15,4)
xx, yy, zz = np.meshgrid(X,Y,Z)
print(xx.shape, yy.shape, zz.shape)
  

Output:

现在我们得到 3 个输出数组,每个数组对应 3D 空间中的 x、y 和 z 坐标。
而且,这三个数组都是3维的。

让我们将这些坐标可视化为3d plot.


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xx, yy, zz)
ax.set_zlim(12, 15)
plt.show()
  

Output:

 

使用 NumPy 网格创建 3D 曲面图

现在让我们研究一下使用的应用之一np.meshgrid,它正在创建 3D 绘图。

我们将首先创建 x 和 y 坐标的 2D 网格,并计算第三轴 (z) 值作为 x 和 y 的函数。


from mpl_toolkits.mplot3d import Axes3D
X = np.linspace(-20,20,100)
Y = np.linspace(-20,20,100)
X, Y = np.meshgrid(X,Y)
Z = 4*xx**2 + yy**2
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap="plasma", linewidth=0, antialiased=False, alpha=0.5)
plt.show()
  

Output:

 

避免 NumPy 网格内存错误

当我们为变量赋值或执行任何计算时,这些值会存储在计算机的“临时”内存或 RAM 中。
这些内存的范围为 8–32 GB。

在创建网格时,我们需要小心,不要创建太大的网格,以至于内存无法容纳。

例如,让我们尝试创建一个大小为 100000×100000 浮点数的网格。


X = np.random.randn(100000)
Y = np.random.randn(100000)
xx,yy =  np.meshgrid(X,Y)
  

Output:

在这里,我们尝试生成一个包含 100 亿个浮点数的网格。
如果每个浮点数占用 8 个字节的内存,那么 100 亿个这样的数字将需要大约 74 GB 的内存,这即使在现代个人计算机中也并不常见。
由于容纳如此大的网格所需的内存超出了可用内存,因此我们得到了这个“MemoryError”。

因此,我们必须小心,不要通过平滑数据或选择较小的坐标范围来​​创建太大的网格。

请注意,即使选择的大小很大并且在内存限制内,如果计算机上没有剩余可用内存,也可能会导致计算机冻结。

 

结论

在本教程中,我们了解了什么是网格及其各种优点。
我们学习了如何使用 NumPy 创建矩形坐标网格meshgrid method.
我们还研究了这些网格的稀疏表示。

然后我们学习了如何使用 meshgrid 方法生成极坐标网格。

我们在创建网格时了解了两种类型的索引,即笛卡尔(默认)索引和矩阵索引。
之后,我们研究了如何翻转网格。我们还尝试通过传递二维数组作为输入来创建网格。

然后我们使用 3 个数组生成 3D 网格,每个数组对应 x、y 和 z 维度。
然后我们研究了网格网格方法在创建 3D 曲面图中的应用。

最后,我们研究了创建网格时出现的“内存错误”问题以及如何避免它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NumPy Meshgrid 从零到英雄 的相关文章

  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo

随机推荐

  • 如何在 Ubuntu 20.04 上安装 Kvm

    KVM 基于内核的虚拟机 是内置于 Linux 内核中的开源虚拟化技术 使用 KVM 运行多个 Linux 或 Windows 来宾虚拟机 每个来宾都与其他来宾完全隔离 并拥有自己的操作系统和专用虚拟硬件 例如 CPU 内存 网络接口和存储
  • 如何在 Ubuntu 20.04 上安装 OpenCV

    OpenCV 开源计算机视觉库 是一个开源计算机视觉库 绑定了 C Python 和 Java 并支持所有主要操作系统 它可以利用多核处理并具有 GPU 加速功能来实现实时操作 OpenCV 的应用范围很广 包括医学图像分析 拼接街景图像
  • 如何在 Debian 10 Linux 上添加交换空间

    交换空间是磁盘上的空间 当物理内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 运行 Debian 虚拟机时不存在交换分区 因此唯一的选择是创建交
  • 如何在 CentOS 8 上安装 Apache Maven

    Apache Maven 是一个开源项目管理和理解工具 主要用于 Java 项目 Maven 使用项目对象模型 POM 它本质上是一个 XML 文件 其中包含有关项目 配置详细信息 项目依赖项等的信息 在本教程中 我们将解释如何在 Cent
  • 如何在 Ubuntu 18.04 上安装 TensorFlow

    TensorFlow是由 Google 构建的免费开源机器学习平台 许多组织都在使用它 包括 Twitter PayPal 英特尔 联想和空中客车公司 TensorFlow 可以在 Python 虚拟环境中安装在系统范围内 作为Docker
  • Linux 中的 Chattr 命令(文件属性)

    在 Linux 中 文件属性是描述文件行为的元数据属性 例如 属性可以指示文件是否被压缩或指定文件是否可以被删除 一些属性 如不变性 可以设置或清除 而其他属性 如加密 是只读的 只能查看 对某些属性的支持取决于所使用的文件系统 本文介绍了
  • 在Ubuntu上安装RPM包

    Ubuntu 存储库包含数千个 deb 软件包 可以从 Ubuntu 软件中心或使用apt命令行实用程序 Deb 是所有基于 Debian 的发行版 包括 Ubuntu 都使用的安装包格式 有些软件包在标准 Ubuntu 存储库中不可用 但
  • 如何检查PHP版本

    PHP 是最常用的服务器端编程语言之一 PHP 版本之间存在一些重要差异 因此在某些情况下可能需要了解您的服务器上运行的是哪个版本 例如 如果您在开始安装之前升级应用程序或安装需要特定 PHP 版本的新应用程序 则需要找出 PHP 服务器的
  • 如何在 Debian 10 Linux 上安装 Google Chrome 网络浏览器

    谷歌浏览器是世界上最流行的网络浏览器 它是专为现代网络打造的快速 直观且安全的浏览器 Chrome 不是开源浏览器 并且不包含在官方 Debian 存储库中 它是基于Chromium 一个开源浏览器 可在默认 Debian Buster 存
  • 如何在 Ubuntu 中将用户添加到 Sudoers

    sudo是一个命令行程序 允许受信任的用户以 root 或其他用户身份执行命令 在本文中 我们将向您展示两种向用户授予 sudo 权限的方法 第一个是将用户添加到sudoers 文件 该文件包含控制向哪些用户和组授予 sudo 权限以及权限
  • 检查 gzip 文件而不解压缩:zcat、zless 和 zmore

    Linux 提供了多个用于处理压缩文件的命令 例如 zcat zless 和 zmore 本教程将深入探讨这些命令的用法 让您可以导航和检查压缩文件 而无需解压缩它们 下表总结了这 3 种工具之间的差异 Tool Description P
  • 使用 source 命令在 Linux 中获取脚本

    The sourceLinux 中的 command 是一个内置的 shell 命令 用于从文件中读取和执行命令 这意味着脚本定义的任何变量或函数在脚本执行完成后仍然可用 现在 让我们开始探索它的功能source命令 目录 hide 1 子
  • Linux 上的 MySQL(初学者教程)

    在这篇文章中 我们将介绍 Linux 上 MySQL 的许多方面 首先 如何安装它 如何执行基本的 CRUD 操作 如何导入和导出数据 如何使用 MySQL 引擎本身 例如设置 root 用户密码 等等 MySQL 是世界上最流行的关系数据
  • 将 NumPy 数组转换为 Pandas DataFrame(15+ 场景)

    通常我们需要在 NumPy 数组中创建数据并将其转换为 DataFrame 因为我们必须处理 Pandas 方法 在这种情况下 转换NumPy 数组 ndarrays 到数据框使我们的数据分析变得方便 在本教程中 我们将仔细研究一些可用于将
  • 使用 Python 发送电子邮件(多个示例)

    Python 允许您使用其内置模块自动执行发送电子邮件的任务 这样做可以让您摆脱手动向数千名用户发送电子邮件的繁琐且耗时的任务 本教程将探讨一些快速 简单的发送电子邮件和使用 Python 内置电子邮件模块的方法 目录 hide 1 检查电
  • Python 中的深度优先搜索算法(多个示例)

    深度优先搜索是一种流行的图遍历算法 在本教程中 我们将通过示例了解它的工作原理 以及我们如何用 Python 实现它 我们将研究以下部分 目录 hide 1 介绍 2 深度优先搜索算法 3 Representing a graph
  • Python NumPy 数组教程

    NumPy 是一个 Python 库 模块 用于科学计算Python编程 在本教程中 您将学习如何对 NumPy 数组执行多种操作 例如以多种方式添加 删除 排序和操作元素 NumPy 提供多维数组对象和其他派生数组 例如屏蔽数组或屏蔽多维
  • 关于 Linux 导出命令您需要了解的一切

    The exportLinux中的命令是一个内置的shell命令 用于设置环境变量在当前 shell 会话中 通过标记变量或函数以便随后导出到子进程的环境中 export命令确保这些变量对子进程的可用性 目录 hide 1 导出命令的语法
  • 安装、配置和使用 Linux NIS 服务器

    我们使用 Linux NIS 服务器 网络信息服务 用于在网络上的系统之间共享存储在平面文件中的关键数据 通常理想的做法是使用共享存储库 例如 NIS 来存储用户和组信息 而不是将它们存储在 etc passwd 等平面文件中 那么这样做有
  • NumPy Meshgrid 从零到英雄

    Python 的 NumPy是处理数组 矩阵数据最常用的库 矩阵可以被视为二维值 网格 其中网格中每个值的位置由一对值 i j 给出 这些值表示该值在网格中的行号和列号 在本教程中 我们将了解如何使用 Python 中的 NumPy 库创建