2017-07-19 20 views
0

配列とpylabのimshow()関数を使用して、2変量データにわたってガウス分布をプロットするコードがあります。 x[i,j]のための私の式はijに対するガウスの製品です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() 

:私のコードは次のようになります。

コードを実行すると、2つのプロットが生成されます。 1つはi/j配列のカラーマップで、中央に明るい点があり、ガウスのように崩壊し、もう1つはj = 50の値のiのプロットなので、正規のガウス曲線にする必要があります。

これは起こることではありません。私がコードを実行すると、データが連続していないようなステップがあります。どうしてこれなの?それは私の方程式、または私の作図テクニックに問題がありますか?

答えて

1

あなたは明らか

sigma = 10.0 

あなたはまた

をフロートする分母をキャストすることができ、 sigmaフロートを作るためにされたパイソン2を使用して integer division

の通常の問題に最も簡単な方法を実行しています

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

シグマを10から10.0に変更しても問題が解決しました。そのような簡単な解決策...ありがとう! –

関連する問題