我是python的新手并尝试绘制具有定义为
的函数的高斯分布
我绘制了正态分布P(x,y),它给出了正确的输出。代码和输出如下。
现在我需要绘制条件分布,输出应该像。要做到这一点,我需要为方程定义边界条件。我试图定义边界条件,但它不起作用。我试过的代码是,但它输出错误 请帮助我如何绘制相同的内容。
谢谢,
答案 0 :(得分:2)
您在错误参数上使用了边界条件,尝试在创建网格点后执行此操作。
R = np.arange(-4, 4, 0.1)
X, Y = np.meshgrid(R, R)
然后根据条件验证X和Y
valid_xy = np.sqrt(X**2+Y**2) >= 1
X = X[valid_xy]
Y = Y[valid_xy]
然后继续使用剩下的代码。
更新
如果您只想将峰值周围的值重置为零,则可以使用以下代码:
import numpy as np
import matplotlib.pyplot as plt
R = np.arange(-4, 4, 0.1)
X, Y = np.meshgrid(R, R)
Z = np.sum(np.exp(-0.5*(X**2+Y**2)))
P = (1/Z)*np.exp(-0.5*(X**2+Y**2))
# reset the peak
invalid_xy = (X**2+Y**2)<1
P[invalid_xy] = 0
# plot the result
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X, Y, P, s=0.5, alpha=0.5)
plt.show()
答案 1 :(得分:0)
你不能再使用np.meshgrid
因为它会输出一个矩阵,其中X和Y的坐标形成一个网格(因此它的名字)而不是一个自定义形状(一个网格减去像你这样的光盘)想):
但是,您可以通过以下方式创建自定义网格:
R = np.arange(-,4,0.1)
xy_coord = np.array(((x,y) for x in R for y in R if (x*x + y*y) > 1))
X,Y = xy_coord.transpose()
X
# array([ 0. , 0. , 0. , ..., 3.9, 3.9, 3.9])
Y
# array([ 1.1, 1.2, 1.3, ..., 3.7, 3.8, 3.9])