use*_*077 5 python 3d numpy matplotlib
我正在尝试使用 matplotlib 可视化多元正态分布。我想生产这样的东西:
我使用以下代码:
from mpl_toolkits import mplot3d
x = np.linspace(-1, 3, 100)
y = np.linspace(0, 4, 100)
X, Y = np.meshgrid(x, y)
Z = np.random.multivariate_normal(mean = [1, 2], cov = np.array([[0.5, 0.25],[0.25, 0.50]]), size = 100000)
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
cmap='viridis', edgecolor='none')
ax.set_title('surface');
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误消息:
...
7 ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
----> 8 cmap='viridis', edgecolor='none')
...
ValueError: shape mismatch: objects cannot be broadcast to a single shape
Run Code Online (Sandbox Code Playgroud)
错误的原因是什么以及如何更正我的代码?
我已经用 完成了此操作scipy.stats.multivariate_normal,使用pdf方法生成 z 值。正如 @Piinthesky 指出的,numpy 实现返回给定分布的 x 和 y 值。使用 scipy 版本的示例可以在Python add gaussian Noise in a radius around a point [close]中找到:
测试于python 3.11.2, scipy 1.10.1, matplotlib 3.7.1,numpy 1.24.3
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
import numpy as np
x = np.linspace(-1, 3, 100)
y = np.linspace(0, 4, 100)
X, Y = np.meshgrid(x, y)
pos = np.dstack((X, Y))
mu = np.array([1, 2])
cov = np.array([[.5, .25],[.25, .5]])
rv = multivariate_normal(mu, cov)
Z = rv.pdf(pos)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z)
fig.show()
Run Code Online (Sandbox Code Playgroud)