python - 如何使用 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()
解决方案
你可以做类似的事情
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
变成一个数组相同。对于任何数组a
,np.sum(a / np.sum(a))
等于 1(因为您可以将常数因子np.sum(a)
置于外部总和之外)。因此,function
始终等于一。
推荐阅读
- javascript - 仅在滚动部分后更改背景颜色
- java - Camel AdviceWith 不模拟端点
- powerbi - DAX - 计算重叠期间的天数
- apache-flink - 如何在 flink 中运行 start_cluster.sh
- ios - CollectionView iOS 中的意外崩溃
- php - 如何告诉 alpine.js 应该编辑哪一行?
- ubuntu - 为什么我无法删除 ubuntu 上正在运行的 docker 容器?
- java - 如何在 Android Studio 中修复我的自动完成建议?似乎错过了明显的那些
- java - java中的定时排序
- angular - Angular 12 设置验证器组件