我使用numpy.meshgrid
方法在Python中绘制3D图。该图是在变量d1, d2
上绘制的,但是我有一个包含7个元素的数组组成的函数,其中3个元素与d1, d2
是独立的。当我尝试绘制图形时,会遇到此错误:
operands could not be broadcast together with shapes (7,) (120,120)
调试代码时,我看到独立于d1, d2
的数组元素具有1的形状,而其他元素具有120的形状。如何使用numpy.meshgrid
方法绘制这样的函数?
谢谢。整个代码如下:
import numpy
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
def function(a, b, c, d1, d2):
Q = numpy.ones(7)
EV = []
EV.append(1 / (a + b))
EV.append(1 / (a + b + c))
EV.append(1 / (a + b + c))
EV.append((1 - numpy.exp(-c * d1)) / c)
EV.append((1 - numpy.exp(-c * d2)) / (c + a))
EV.append((1 - numpy.exp(-c * d1)) / c)
EV.append((1 - numpy.exp(-c * d2)) / (c + a))
return numpy.sum(numpy.multiply(Q, EV) / numpy.sum(numpy.multiply(Q, EV)))
fig = plt.figure()
ax = fig.gca(projection='3d')
# Make data.
d1 = numpy.arange(0, 6, 0.05)
d2 = numpy.arange(0, 6, 0.05)
X, Y = numpy.meshgrid(d1, d2)
# Plot the surface.
ax.set_zlim(2.00, 8.00)
surf = ax.plot_surface(X, Y, function(1, 1, 1, X, Y), cmap='viridis', linewidth=0, antialiased=False)
# Customize the z axis.
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
# Add a color bar which maps values to colors.
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
答案 0 :(得分:1)
您可以做类似的事情
Z = np.array([[function(1, 1, 1, x, y) for x in d1] for y in d2])
surf = ax.plot_surface(X, Y, Z, cmap='viridis', linewidth=0, antialiased=False)
但是,该图并不是特别有趣:首先,标识运算乘以1的数组是标识操作,因此np.multiply(Q, EV)
与将EV
转换为数组相同。对于任何数组a
,np.sum(a / np.sum(a))
等于1(因为您可以将常数np.sum(a)
置于外部总和之外)。因此,function
始终等于1。