gpt4 book ai didi

python - 为什么 pyplot.contour() 要求 Z 是二维数组?

转载 作者:太空狗 更新时间:2023-10-29 18:02:48 27 4
gpt4 key购买 nike

matplotlib.pyplot.contour() 函数采用 3 个输入数组 XYZ
数组 XY 指定点的 x 和 y 坐标,而 Z 指定感兴趣函数在点数。

我知道 np.meshgrid() 可以轻松生成用作 contour() 参数的数组:

X = np.arange(0,5,0.01)
Y = np.arange(0,3,0.01)

X_grid, Y_grid = np.meshgrid(X,Y)
Z_grid = X_grid**2 + Y_grid**2

plt.contour(X_grid, Y_grid, Z_grid) # Works fine

这很好用。方便的是,这也很好用:

plt.contour(X, Y, Z_grid)  # Works fine too

但是,为什么 Z 输入需要是二维数组?

为什么像下面这样的东西是不允许的,即使它指定了所有相同的数据适当对齐?

plt.contour(X_grid.ravel(), Y_grid.ravel(), Z_grid.ravel())  # Disallowed

另外,当指定了only Z(没有相应的XY)时,语义是什么? ?

最佳答案

查看the documentation of contour人们发现有几种方法可以调用此函数,例如contour(Z)contour(X,Y,Z)。因此您会发现它根本不需要任何 XY 值。

然而,为了绘制等高线,函数必须知道底层网格。 Matplotlib 的 contour 基于矩形网格。但即便如此,允许 contour(z),其中 z 是一维数组,将无法知道应该如何绘制场。在 contour(Z) 的情况下,其中 Z 是一个二维数组,它的形状明确地设置了绘图的网格。

一旦网格已知,可选的XY 数组是否展平就变得不重要了;这实际上是文档告诉我们的内容:

X and Y must both be 2-D with the same shape as Z, or they must both be 1-D such that len(X) is the number of columns in Z and len(Y) is the number of rows in Z.

也很明显plt.contour(X_grid.ravel(), Y_grid.ravel(), Z_grid.ravel())无法生成等值线图,因为所有关于网格形状的信息都丢失了,没办法轮廓函数可以知道如何解释数据。例如。如果 len(Z_grid.ravel()) == 12,底层网格的形状可以是 (1,12), (2,6), (3,4), ( 4,3), (6,2), (12,1)

一个可能的出路当然是允许一维数组并引入参数 shape,例如 plt.contour(x,y,z, shape=(6,2) )。然而,情况并非如此,因此您必须接受 Z 需要是 2D 的事实。

但是,如果您正在寻找一种方法来获得具有扁平(散乱)数组的计数图,则可以使用 plt.tricontour() .

plt.tricontour(X_grid.ravel(), Y_grid.ravel(), Z_grid.ravel()) 

此处将使用 Delaunay 三角剖分在内部生成一个三角形网格。因此,即使是完全随机化的点也会产生不错的结果,如下图所示,其中将其与给予 contour 的相同随机点进行比较。

enter image description here

(这里是code to produce this picture)

关于python - 为什么 pyplot.contour() 要求 Z 是二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42045921/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com