Python 如何使用numpy.meshgrid绘制函数

Python 如何使用numpy.meshgrid绘制函数,python,numpy,matplotlib,Python,Numpy,Matplotlib,我使用numpy.meshgrid方法在Python中绘制3D绘图。这个图是在变量d1,d2上绘制的,但是我有一个由7个元素组成的数组,其中3个元素独立于d1,d2。当我尝试绘制图形时,我会遇到以下错误: 操作数无法与形状7120120一起广播 当我调试代码时,我看到独立于d1的数组元素,d2的形状为1,而其他元素的形状为120。如何使用numpy.meshgrid方法绘制这样的函数 谢谢。整个代码如下所示: import numpy from mpl_toolkits.mplot3d impo

我使用numpy.meshgrid方法在Python中绘制3D绘图。这个图是在变量d1,d2上绘制的,但是我有一个由7个元素组成的数组,其中3个元素独立于d1,d2。当我尝试绘制图形时,我会遇到以下错误:

操作数无法与形状7120120一起广播

当我调试代码时,我看到独立于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()

你可以这样做

Z=np.数组[[函数1,1,1,x,y代表d1中的x]代表d2中的y] surf=ax.plot_surfaceX,Y,Z,cmap='viridis',线宽=0,抗锯齿=False
不过,这一情节不会特别有趣:首先,按元素乘以一个1数组是恒等式运算,因此np.multiplyQ,EV与将EV转化为一个数组是一样的。对于任何数组a,np.suma/np.suma等于1,因为可以将常数因子np.suma取在外和之外。因此,函数始终等于一。

您的函数为每个输入生成一个由7个数字组成的数组;e、 g.函数1,1,1,0,0是数组[0.42857143,0.28571429,0.28571429,0,0,0,0.]。你希望这是怎么画的?对不起,你是对的!这是更大代码的一部分。我编辑代码并重新检查它,想象我绘制输出数组的元素和。这个错误不是因为你所说的,而是我修改了代码,使其具有1D输出。与np.meshgrid有什么关系?错误发生在numpy.sumnumpy.multiplyQ,EV/numpy.sumnumpy.multiplyQ,EV中。不知道您要计算什么,无论如何,结果应该是120120的形状,这样您可以在plot_surfaceX,Y,Z中调用它作为Z。重点是我的函数最初接受单变量而不是数组,但当我使用numpy.meshgrid时,它会生成一个d1,d2的所有可能出现的2D数组,并将其传递给函数。如果你仔细观察我的函数,你会发现它产生了7个数字,3是独立于d1,d2的,其他的有d1,d2,所以结果的维数很奇怪。输出是一个由3个单数和4个120 x 120的数组组成的列表。非常感谢您的回答,您的回答完全正确。但由于矩阵计算在速度方面有很好的性能,所以我不想用于循环。你知道点在哪里吗,我知道它的值总是1,但它不是点。关键是我的函数最初接受单变量而不是数组,但当我使用numpy.meshgrid时,它会为d1、d2生成一个所有可能出现的2D数组,并将其传递给函数。如果你仔细观察我的函数,你可以看到它生成7个数字,即3,独立于d1、d2,其他数字都有d1,所以结果的维数很奇怪。输出是一个由3个单数和4个120 x 120的数组组成的列表。编辑后,输出是一个单数,即模取整问题,始终为1。亲爱的@fuglede这不是一个数学问题,错误是因为输出始终为1??不,我想知道如何使用不平衡函数的网格网格;只是在这种特殊的情况下,它会使情节变成它最终的样子。该方法具有完全的通用性。