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 从零到英雄 的相关文章

  • 为什么 Python 在导入脚本时只保存脚本的字节码?

    既然执行Python字节码会比运行原始源代码更快 因为Python不需要重新编译 为什么Python在导入脚本时只保存编译后的字节码呢 为每个执行的脚本保存 pyc 文件不是更好吗 无论如何 Python 解释器的启动时间都需要时间 即使您
  • 为什么需要在 Python 方法中显式使用“self”参数? [复制]

    这个问题在这里已经有答案了 当在 Python 中的类上定义方法时 它看起来像这样 class MyClass object def init self x y self x x self y y 但在其他一些语言中 例如 C 您可以使用
  • scipy.optimize on pandas dataframe

    我试图搜索它 但结果很差 有人可以向我解释一下如何在 Pandas DataFrame 上执行 optimize minimize 以便最小化 DataFrame 中的类别和结果列之间的错误 考虑这个例子 import pandas as
  • 通过 python 中的另外两个修改数组[重复]

    这个问题在这里已经有答案了 假设我们有三个一维数组 A 长度为 5 B 长度相同 示例中为5 C 更长 比如长度为 100 C最初用零填充 A给出索引C应更改的元素 它们可能会重复 以及B给出应添加到初始零的值C 例如 如果A 1 3 3
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 雅虎财务请求功能出现 404 客户端错误

    yahoo Financials的请求功能出现404 Client Error 直接点击以下网址没有问题 https finance yahoo com quote AAPL financials p AAPL https finance
  • App Engine NDB:如何访问属性的 verbose_name

    假设我有这个代码 class A ndb Model prop ndb StringProperty verbose name Something m A m prop a string value 当然 现在如果我打印 m prop 它会
  • 正在使用 PIL 保存损坏的图像

    我遇到一个问题 操作图像像素导致保存损坏的图像 因此 我使用 PIL 打开图像 然后将其转换为 NumPy 数组 image Image open myimage png np image np asarray image 然后 我转置图像
  • 更改 Matplotlib 投影轴的背景颜色

    我正在尝试使用 Cartopy 创建一个图形 该图形需要在未投影的轴上绘制投影轴 这是一个尽可能简单的代码版本 它将轴上的内容替换为背景颜色 import matplotlib pyplot as plt import cartopy cr
  • 使用 if 语句的网格网格和用户定义函数的真值不明确

    假设我有一个函数f x y 足够光滑 然而 有些值仅在有限的意义上存在 以sin x x的价值x 0只存在于极限 x gt 0 中 在一般情况下 我用一个来处理这个问题if陈述 如果我在情节中使用它meshgrid我收到一条错误消息 Val
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • Seaborn 中没有线性拟合的散点图

    我想知道是否有办法关闭seaborn中的线性拟合lmplot或者是否有一个等效函数可以生成散点图 当然 我也可以使用 matplotlib 但是 我发现 seaborn 中的语法和美学非常吸引人 例如 我想绘制以下情节 import sea
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • 如何在matplotlib中调整x轴

    I have a graph like this x轴上的数据表示小时 所以我希望x轴设置为0 24 48 72 而不是现在的值 很难看到 0 100 之间的数据 fig1 plt figure ax fig1 add subplot 11
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 如何使用 enumerate 来倒数?

    letters a b c 假设这是我的清单 在哪里for i letter in enumerate letters 将会 0 a 1 b 2 c 我怎样才能让它向后枚举 如 2 a 1 b 0 c 这是一个很好的解决方案并且工作完美 i
  • Python 相当于 Scala 案例类

    Python 中是否有与 Scala 的 Case Class 等效的东西 就像自动生成分配给字段而无需编写样板的构造函数一样 当前执行此操作的现代方法 从 Python 3 7 开始 是使用数据类 https www python org
  • 如何同时接受int和float类型的输入?

    我正在制作一个货币转换器 如何让 python 同时接受整数和浮点数 我就是这样做的 def aud brl amount From to ER 0 42108 if amount int if From strip aud and to
  • 基于值的 matplotlib 条形图颜色

    有没有一种方法可以根据条形图的值对条形图的条形进行着色 例如 values below 0 5 red values between 0 5 to 0 green values between 0 to 08 blue etc 我找到了一些
  • 在Python中停止ThreadPool中的进程

    我一直在尝试为控制某些硬件的库编写一个交互式包装器 用于 ipython 有些调用对 IO 的影响很大 因此并行执行任务是有意义的 使用 ThreadPool 几乎 效果很好 from multiprocessing pool import

随机推荐

  • 如何在 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 库创建