首页 > 解决方案 > 如何使用 numpy.meshgrid 绘制函数

问题描述

我使用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()

标签: pythonnumpymatplotlib

解决方案


你可以做类似的事情

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)

不过,这个情节不会特别有趣:首先,逐个元素乘以一个数组是恒等运算,因此np.multiply(Q, EV)EV变成一个数组相同。对于任何数组anp.sum(a / np.sum(a))等于 1(因为您可以将常数因子np.sum(a)置于外部总和之外)。因此,function始终等于一。


推荐阅读