numpy中使用meshgrid生成二维数组矩阵,组成坐标轴上坐标,加上mgrid的理解

这篇博客探讨了Python中用于创建网格坐标的`meshgrid`和`mgrid`函数。`meshgrid`用于在二维坐标轴上生成交叉点,而`mgrid`则以更灵活的方式创建网格。通过实例,作者展示了如何使用这两个函数,以及它们在机器学习预测函数中的应用。此外,还展示了如何将网格数据扁平化以及如何进行转置操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、meshgrid

1、问题描述
  今天在看机器学习视频时,看到预测函数中有下面的代码

xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                         np.arange(x2_min, x2_max, resolution))
Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)

  不太懂其中的意思,索性就进行了下面的分析和测试。
2、分析
  该函数可以在二维坐标轴上生成对应的交叉点,每个交叉点对应一个坐标,坐标的X轴取值为:[0. 0.2 0.4 0.6 0.8],Y轴取值为:[1 1.5 2],进行将X/Y轴取值进行组合后,可以拼接成相应的坐标,其测试代码如下:

import numpy as np

XX1, XX2 = np.meshgrid(np.arange(0, 1, 0.2), np.arange(1, 2.1, 0.5))
# [[0.  0.2 0.4 0.6 0.8]
#  [0.  0.2 0.4 0.6 0.8]
#  [0.  0.2 0.4 0.6 0.8]]
print(XX1)
# <class 'numpy.ndarray'>
print(type(XX1))
# (3, 5)
print(XX1.shape)
# [[1.  1.  1.  1.  1. ]
#  [1.5 1.5 1.5 1.5 1.5]
#  [2.  2.  2.  2.  2. ]]
print(XX2)
# 将数据进行扁平化
# [0.  0.2 0.4 0.6 0.8 0.  0.2 0.4 0.6 0.8 0.  0.2 0.4 0.6 0.8]
print(XX1.ravel())
# <class 'numpy.ndarray'>
print(type(XX1.ravel()))
# [1.  1.  1.  1.  1.  1.5 1.5 1.5 1.5 1.5 2.  2.  2.  2.  2. ]
print(XX2.ravel())

Z = np.array([XX1.ravel(), XX2.ravel()])
# [[0.  0.2 0.4 0.6 0.8 0.  0.2 0.4 0.6 0.8 0.  0.2 0.4 0.6 0.8]
#  [1.  1.  1.  1.  1.  1.5 1.5 1.5 1.5 1.5 2.  2.  2.  2.  2. ]]
print(Z)
# [[0.  1. ]
#  [0.2 1. ]
#  [0.4 1. ]
print(Z.T)

2、mgrid

1、代码

# 5j个点,步长为复数表示点数,为实数表示步长
# np.mgrid[start:end:step]
x1, x2 = np.mgrid[-5:5:5j, -5:5:5j]

# 输出结果
[[-5.  -5.  -5.  -5.  -5. ]
 [-2.5 -2.5 -2.5 -2.5 -2.5]
 [ 0.   0.   0.   0.   0. ]
 [ 2.5  2.5  2.5  2.5  2.5]
 [ 5.   5.   5.   5.   5. ]] 
 
 [[-5.  -2.5  0.   2.5  5. ]
 [-5.  -2.5  0.   2.5  5. ]
 [-5.  -2.5  0.   2.5  5. ]
 [-5.  -2.5  0.   2.5  5. ]
 [-5.  -2.5  0.   2.5  5. ]]
print(x1, x2)
<think>好的,用户想了解如何使用linspace在Python的Matplotlib或NumPy生成二维网格并绘图。首先,我需要回忆一下linspace的用法。linspace是NumPy中的一个函数,用于生成等间隔的数值点,通常用于创建一维数组。但用户提到的是二维网格,所以可能需要结合meshgrid函数来生成二维坐标矩阵。 接下来,我需要确定步骤。首先,生成一维数组,然后使用meshgrid创建二维网格。之后,可能需要定义一个函数来计算每个点的值,比如常见的二维函数如sin(x) + cos(y)或者其他例子。然后,使用Matplotlib的绘图函数,比如contour或contourf来绘制等高线图,或者用plot_surface绘制三维图。 还要考虑用户是否需要示例代码。根据用户提供的引用,特别是引用[2]和引用[4],用户可能已经有一些使用Matplotlib的基础,但需要扩展到二维的情况。需要确保代码正确导入numpy和matplotlib,并且步骤清晰。 另外,用户的问题可能涉及两种常见的二维网格生成方法:meshgridmgrid。我应该选择其中一种来演示,可能meshgrid更常用,因为它更灵活。然后,举例说明如何生成网格数据,并绘制等高线图或三维图。 可能还需要提到颜色映射、添加标题和标签等步骤,以完善图形。根据引用[3]和[4],用户可能对自定义刻度、添加网格等也有兴趣,但当前问题主要是生成二维网格并绘图,所以重点应放在那里。 需要检查是否有常见的错误,比如忘记导入库,或者参数设置不当。例如,linspace的参数是起始点、结束点和点数,meshgrid需要两个一维数组作为输入,生成两个二维数组。 最后,生成相关问题,可能涉及其他类型的二维图形,优化图形显示的方法,或者三维绘图的扩展。确保问题与主题相关,帮助用户进一步学习。</think>### 如何使用linspace生成二维网格并绘图 在Python中,使用`numpy.linspace`结合`numpy.meshgrid`可以生成二维网格,并通过Matplotlib可视化。以下是具体步骤: --- #### **1. 生成一维数组** `numpy.linspace`用于生成均匀分布的一维数组。例如: ```python import numpy as np x = np.linspace(-5, 5, 100) # 在[-5,5]区间生成100个点 y = np.linspace(-3, 3, 50) # 在[-3,3]区间生成50个点 ``` --- #### **2. 创建二维网格** 使用`numpy.meshgrid`将一维数组转换为二维网格坐标矩阵: ```python X, Y = np.meshgrid(x, y) # X和Y均为50行100列的二维数组 ``` 此时,`X`和`Y`分别表示网格中每个点的横纵坐标,可用于计算二维函数值。 --- #### **3. 定义二维函数并计算值** 以函数$Z = \sin(X) + \cos(Y)$为例: ```python Z = np.sin(X) + np.cos(Y) # 对每个网格点计算函数值 ``` --- #### **4. 绘制二维图形** 使用Matplotlib的`contourf`或`pcolormesh`绘制等高线或伪彩色图: ```python import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) plt.contourf(X, Y, Z, cmap='viridis') plt.colorbar() plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('二维函数图:$\sin(x) + \cos(y)$') plt.show() ``` --- #### **完整示例代码** ```python import numpy as np import matplotlib.pyplot as plt # 生成一维数组 x = np.linspace(-5, 5, 100) y = np.linspace(-3, 3, 50) # 创建二维网格 X, Y = np.meshgrid(x, y) # 计算函数值 Z = np.sin(X) + np.cos(Y) # 绘图 plt.figure(figsize=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值