Python numpy.meshgrid函数方法的使用

numpy.meshgrid 是 NumPy 库中一个非常有用的函数,它生成坐标矩阵,用于向量化评估在二维或更高维度上的函数。它通常用于创建网格点,然后在这些网格点上进行函数计算或绘图。本文主要介绍一下NumPy中meshgrid方法的使用。

numpy.meshgrid

numpy.meshgrid(*xi, copy=True, sparse=False, indexing='xy')[source]

从坐标向量返回坐标矩阵。

给定一维坐标数组x1,x2,…,xn,制作N-D坐标数组以对N-D网格上的N-D标量/矢量场进行矢量化评估。

Changed in version 1.9: 1-D and 0-D cases are allowed.

参数 :

x1, x2,…, xn :array_like

表示网格坐标的一维数组。

indexing{‘xy’, ‘ij’}, 可选

笛卡尔(默认为'xy'

或矩阵('ij')的输出索引。

 有关更多详细信息,请参见注释。

 1.7.0版中的新功能。

sparsebool, 可选

如果为True

则返回一个稀疏网格以节省内存。

 默认值为False。 1.7.0版中的新功能。

copybool, 可选

如果为False

则返回原始数组的视图以节省内存。

 默认值为True。请注意,

sparse = False,copy = False

可能会返回非连续数组。

 此外,广播阵列的一个以上的元素

可以引用单个存储位置。

 如果需要写入阵列,请先进行复制。 

1.7.0版中的新功能。

返回值 :

X1, X2,…, XN :ndarray

对于长度为Ni = len(xi)的向量x1,x2,…,'xn',

如果返回(N1,N2,N3,... Nn)形状的数组

indexing ='ij'

(N2,N1,N3,... Nn)形状的数组,

如果indexing ='xy'

且重复xi的元素以沿x1的第一个维度填充矩阵,

 第二个用于x2,依此类推。

Notes

此函数通过indexing关键字参数支持两种索引约定。 赋予字符串'ij'将返回具有矩阵索引的网格,而'xy'将返回具有笛卡尔索引的网格。 在输入长度为M和N的二维情况下,对于'xy'索引,输出的形状为(N,M),对于'ij'索引,输出的形状为(M,N)。 在输入长度为M,N和P的3-D情况下,对于“ xy”索引,输出的形状为(N,M,P),对于'ij'索引输出的形状为(M,N,P)。 以下代码片段说明了这种差异:

import numpy as np

# 定义 x 和 y 的一维数组
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

# 生成网格,使用 'ij' 索引
xv_ij, yv_ij = np.meshgrid(x, y, sparse=False, indexing='ij')
nx, ny = len(x), len(y)

print("Using 'ij' indexing:")
for i in range(nx):
    for j in range(ny):
        # 处理 xv_ij[i,j], yv_ij[i,j]
        print(f"xv_ij[{i},{j}] = {xv_ij[i, j]}, yv_ij[{i},{j}] = {yv_ij[i, j]}")

print("\n")

# 生成网格,使用 'xy' 索引
xv_xy, yv_xy = np.meshgrid(x, y, sparse=False, indexing='xy')

print("Using 'xy' indexing:")
for i in range(nx):
    for j in range(ny):
        # 处理 xv_xy[j,i], yv_xy[j,i]
        print(f"xv_xy[{j},{i}] = {xv_xy[j, i]}, yv_xy[{j},{i}] = {yv_xy[j, i]}")

在1-D和0-D情况下,索引和稀疏关键字无效

例子

1)基础用法

import numpy as np

# 定义两个一维数组
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

# 生成网格
X, Y = np.meshgrid(x, y)

print("X:")
print(X)
print("Y:")
print(Y)

2)三维网格

import numpy as np

# 定义三个一维数组
x = np.array([1, 2])
y = np.array([3, 4])
z = np.array([5, 6])

# 生成三维网格
X, Y, Z = np.meshgrid(x, y, z)

print("X:")
print(X)
print("Y:")
print(Y)
print("Z:")
print(Z)

3)稀疏网格

import numpy as np

# 定义两个一维数组
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

# 生成稀疏网格
X, Y = np.meshgrid(x, y, sparse=True)

print("X:")
print(X)
print("Y:")
print(Y)

4)indexing 参数

import numpy as np

# 定义两个一维数组
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

# 使用 'ij' 索引生成网格
X, Y = np.meshgrid(x, y, indexing='ij')

print("X:")
print(X)
print("Y:")
print(Y)

5)使用示例

import numpy as np

# 定义网格的大小
nx, ny = (3, 2)

# 生成 x 和 y 的等间隔点
x = np.linspace(0, 1, nx)
y = np.linspace(0, 1, ny)

# 生成稠密网格
xv_dense, yv_dense = np.meshgrid(x, y)

print("Dense meshgrid:")
print("xv_dense:")
print(xv_dense)
print("yv_dense:")
print(yv_dense)

# 生成稀疏网格
xv_sparse, yv_sparse = np.meshgrid(x, y, sparse=True)

print("\nSparse meshgrid:")
print("xv_sparse:")
print(xv_sparse)
print("yv_sparse:")
print(yv_sparse)

meshgrid对于评估网格上的功能非常有用

import numpy as np
import matplotlib.pyplot as plt

# 定义 x 和 y 的范围
x = np.arange(-5, 5, 0.1)
y = np.arange(-5, 5, 0.1)

# 生成网格
xx, yy = np.meshgrid(x, y, sparse=True)

# 计算 z 值
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)

# 绘制等高线填充图
h = plt.contourf(x, y, z, cmap='viridis')

# 添加颜色条
plt.colorbar(h)

# 显示图形
plt.show()


推荐阅读
cjavapy编程之路首页