Сообщение об ошибке
Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim'
говорит о том, что список Z
не имеет атрибута ndim
.ndim
- это атрибут массивов NumPy .Поэтому вполне вероятно, что преобразование Z
в массив NumPy решит проблему (или, по крайней мере, поможет вам преодолеть AttributeError
):
Z = np.array(Z)
Например,
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
X = list(np.linspace(-4, 4, 100))
Y = list(np.linspace(-4, 4, 100))
X, Y = np.meshgrid(X, Y)
Z = np.sin((X**2 + Y**2)/4)
# Z = (np.sin((X**2 + Y**2)/4)).tolist()
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.viridis)
plt.show()
работает нормально, но если вы раскомментируете строку
Z = (np.sin((X**2 + Y**2)/4)).tolist()
, которая делает Z
списком списков, вы получите сообщение об ошибке
Z.ndim != 2:
AttributeError: 'list' object has no attribute 'ndim'