python报错TypeError: Input z must be 2D, not 3D的解决方法

  • Post category:Python

当我们在使用 Python 时,有时候会遇到“TypeError: Input z must be 2D, not 3D”的错误。这个错误通常是由于我们传递给一个函数的参数的形状不正确引起的。这个错误可能出现在使用 matplotlib 绘制三维图形时。以下是一些常见的原因和解决方法。

原因

当我们尝试使用 plot_surface 函数时,如果传递给它的参数 Z 的形状是 3D 的,就会引发此错误,因为该函数只能接受 2D 的输入。同样的,如果我们使用 plot_wireframe 函数也会出现同样的错误。

解决方法

方法一:使用 flatten() 函数

为了解决这个问题,我们需要将 Z 改为一个 2D 的 numpy 数组。这可以通过 flatten() 函数来实现,该函数将其参数扁平化为一个 1D 的数组,然后将其重新形状为一个 2D 数组。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 创建数据
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 绘制3D图形
fig = plt.figure()
ax = fig.gca(projection='3d')
Z_2D = Z.flatten()
X_2D = X.flatten()
Y_2D = Y.flatten()
ax.plot_trisurf(X_2D, Y_2D, Z_2D)

# 显示图形
plt.show()

在上面的代码中,首先创建 X 和 Y 两个一维的数组,并使用 np.meshgrid() 将它们转换成 2D 的数组。接着创建一个 Z 数组,并使用 flatten() 将其转换成 1D 的形状,然后将它重新转换成 2D 的数组。最后,我们使用 plot_trisurf() 函数来绘制三维图形。

方法二:使用 Meshgrid

另外一种方法是使用 meshgrid 函数。meshgrid 函数可以将所有的输入向量转换成一个大的坐标矩阵,以便于绘制 3D 图像。下面是示例代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 创建数据
x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 绘制3D图形
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z)

# 显示图形
plt.show()

在这个例子中,我们不需要使用 flatten() 函数。我们只是用 X、Y、Z 三个数组来直接调用 plot_surface() 函数来绘制 3D 图形。这是因为 meshgrid 函数已经把 X、Y 转化成了二维的数组,确保了数据是二维的。而 plot_surface() 函数接受的三个参数必须都是二维的数组,所以没有了以上错误。

这就是解决 Python 报错 TypeError: Input z must be 2D, not 3D 的两种方法。