Python Axes3D:尝试生成三维打印时出现Numpy阵列错误

Python Axes3D:尝试生成三维打印时出现Numpy阵列错误,python,python-2.7,numpy,plot,Python,Python 2.7,Numpy,Plot,让我们从头开始。这是我获取x和y值的方法: from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.gca(projection='3d') # get current axis w0 = np.arange(30, 80, 1) # x - values w1 = np.arange(-3, 3, 0.1) # y - values X, Y = np.meshgrid(w0, w1) # no idea wh

让我们从头开始。这是我获取
x
y
值的方法:

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.gca(projection='3d') # get current axis

w0 = np.arange(30, 80, 1) # x - values
w1 = np.arange(-3, 3, 0.1) # y - values

X, Y = np.meshgrid(w0, w1) # no idea why to do that
因为我不知道如何避免循环,所以我采用这种方法来计算Z值:

    sizeWo = len(w0)
    sizeW1 = len(w1)
    Z = np.zeros((sizeWo, sizeW1))

    for i in xrange(0,sizeWo):
        for j in xrange(0,sizeW1):
            Z[i,j] = errorLose(w0[i], w1[j])

surf = ax.plot_surface(X, Y, Z) # that lines generates the error (ValueError: shape mismatch: objects cannot be broadcast to a single shape)
即使此代码也会生成相同的错误:

surf = ax.plot_surface(w0, w1, Z) shape mismatch: objects cannot be broadcast to a single shape
plt.show()
这里出了什么问题以及如何使其发挥作用

errorLose
函数获取两个值,并使用数据帧
data
behind计算错误:

def errorLose(w0,w1):
    return np.sum((data.Height - (w0 + w1 *data.Weight))**2)
这就是获得相同数据的方法。此链接指向:


你很接近。问题是您正在创建
Z
成为
sizeWo x sizeW1
,但是
meshgrid
创建
x
Y
,它们是大小
sizeW1 x sizeW0
。您可以以不同的方式设置
Z

Z = np.zeros((sizeW1, sizeWo))

for i in xrange(0,sizeWo):
    for j in xrange(0,sizeW1):
        Z[j,i] = errorLose(w0[i], w1[j])
或者您可以保持
Z
不变,只需将
Z
的转置传递给绘图构造函数

surf = ax.plot_surface(X, Y, np.transpose(Z))
更新


需要使用
meshgrid
的原因是,最初x和y坐标仅为1D阵列,
plot\u surface
希望
x
y
为2D阵列。
meshgrid
所做的是,它使用两个输入的每个排列创建二维数组。包含关于
meshgrid

@Rocketq的更详细的讨论抱歉,那是我的打字错误。现在更新。哇,这太棒了)但是为什么我们需要
meshgrid
?@Rocketq我在最后添加了一个关于这一点的讨论,以及一个潜在相关答案的链接
surf = ax.plot_surface(X, Y, np.transpose(Z))