我有一段代码,应该使用数组和pylab的imshow()函数在双变量数据上绘制高斯分布。我的代码如下:
from pylab import *
x = zeros((101,101))
mean_i = 50
mean_j = 50
sigma = 10
max_ = 100
for i in range(101):
for j in range(101):
x[i,j] = max_*exp(((-(i-mean_i)**2)-(j-mean_j)**2)/(2*(sigma**2)))
for i in range(101):
plot(i,x[i,50], 'rx')
show()
imshow(x)
show()
其中x[i,j]
的等式是i
和j
的高斯的乘积。
如果您运行代码,您将看到生成了两个图表;一个是i/j
数组的颜色图,它应该在中心有一个亮点并且像高斯那样衰减,另一个是j = 50的i
值的图,所以应该是规则的高斯曲线。
这不是发生的事情。当我运行代码时,有一些步骤,就像我觉得它应该是数据不连续。为什么是这样?我的等式或我的绘图技术是一个问题吗?
答案 0 :(得分:1)
你显然正在使用python 2并遇到integer division
的常见问题最简单的方法是让sigma
成为浮动,
sigma = 10.0
你也可以将分母投射到浮动
x[i,j] = max_*exp(((-(i-mean_i)**2)-(j-mean_j)**2)/float(2*(sigma**2)))
或者您可以在脚本开头导入python 3除法行为:
from __future__ import division
并保持其余部分相同。
我还建议调整你的代码以摆脱for循环。此外,导入pylab
的所有内容均为not recommended。
import numpy as np
import matplotlib.pyplot as plt
mean_i = 50
mean_j = 50
sigma = 10.
max_ = 100
X,Y = np.meshgrid(np.arange(101), np.arange(101))
x = max_*np.exp(((-(X-mean_i)**2)-(Y-mean_j)**2)/(2*(sigma**2)))
plt.plot(np.arange(101),x[:,50], 'rx')
plt.show()
plt.imshow(x)
plt.show()