Axes3D:尝试构建 3D 绘图时出现 Numpy 数组错误
Posted
技术标签:
【中文标题】Axes3D:尝试构建 3D 绘图时出现 Numpy 数组错误【英文标题】:Axes3D: Numpy arrays error while trying to build 3D plot 【发布时间】:2016-08-08 16:52:20 【问题描述】:让我们从头开始。这就是我获得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
计算错误:
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】:你很亲密。问题是您将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 坐标最初只是一维数组,而plot_surface
期望X
和Y
是二维数组。 meshgrid
所做的是它从两个输入中创建二维数组,其中每两个输入都排列。 This answer 包含对meshgrid
的更详细讨论。
【讨论】:
@Rocketq 抱歉,这是我的错字。现已更新。 哇,这太棒了)但是为什么我们需要meshgrid
?
@Rocketq 我在最后添加了一些讨论,以及指向可能相关答案的链接以上是关于Axes3D:尝试构建 3D 绘图时出现 Numpy 数组错误的主要内容,如果未能解决你的问题,请参考以下文章