【问题标题】:Axes3D: Numpy arrays error while trying to build 3D plotAxes3D:尝试构建 3D 绘图时出现 Numpy 数组错误
【发布时间】:2016-08-08 16:52:20
【问题描述】:

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

【问题讨论】:

    标签: python python-2.7 numpy plot


    【解决方案1】:

    你很亲密。问题是您将Z 创建为sizeWo 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 的转置传递给您的绘图构造函数

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

    更新

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

    【讨论】:

    • @Rocketq 抱歉,这是我的错字。现已更新。
    • 哇,这太棒了)但是为什么我们需要meshgrid
    • @Rocketq 我在最后添加了一些讨论,以及指向可能相关答案的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2015-12-06
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多