Axes3D:尝试构建3D p时出现Numpy数组错误

2024-09-24 00:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

让我们从头开始。我就是这样得到xy值的:

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计算错误:

def errorLose(w0,w1):
    return np.sum((data.Height - (w0 + w1 *data.Weight))**2)

这就是获得相同数据的方法。这是指向csv file的链接:

data = pd.read_csv('weights_heights.csv', index_col='Index')

Tags: csvtodatanpfigpltaxw1
1条回答
网友
1楼 · 发布于 2024-09-24 00:25:30

你离得很近。问题是,您正在创建ZsizeWo x sizeW1,但^{meshgrid创建XY大小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的转置传递给plot构造函数

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

更新

需要使用meshgrid的原因是,x和y坐标最初只是1D数组,而plot_surface期望XY是2D数组。meshgrid所做的是,它用两个输入的每一个排列来创建二维数组。This answer包含对meshgrid的更详细的讨论。

相关问题 更多 >