2017-07-19 59 views
0

我有一段代碼,它應該使用數組和pylab中的imshow()函數在雙變量數據上繪製高斯分佈。我的代碼如下所示:python中的圖形沒有被正確地繪製

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]方程是高斯爲ij產品。

如果您運行代碼,您會看到生成了兩個圖;一個是i/j陣列的色彩映射圖,它應該在中心有一個亮點,並以高斯形式衰減,另一個是j = 50的值的圖,所以應該是規則的高斯曲線。

這不是發生了什麼事。當我運行代碼時,有一些步驟,比如我覺得應該是數據不連續。爲什麼是這樣?這是我的等式還是我的繪圖技術的問題?

回答

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() 
+0

將sigma從10更改爲10.0已解決了我的問題。這樣一個簡單的解決方案...謝謝! –