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

时间:2016-04-16 19:35:00

标签: python python-2.7 numpy plot

让我们从头开始。这是我获取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')

1 个答案:

答案 0 :(得分:4)

你非常接近。问题是您要创建ZsizeWo x sizeW1 ,但 meshgrid创建XY,其大小为{{1} }}。您可以以不同方式设置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)) 的原因是您的x和y坐标最初只是 1D数组meshgrid期望plot_surface和{{1成为2D数组。 X做的是它从两个输入创建二维数组,每个输入都是两个输入。 This answer包含对Y

的更详细讨论