2016-05-01 5 views
0

単位円(numpy.random.normal(0,1)を使用)で2000個のランダムな点が与えられた場合、出力が円になるように正規化したいのですが、どうすればいいですか?プロットされた点を正規化して円を得るには?

私の努力を示すように要求されました。これは大きな疑問の一部です:単位円の円周から一様に2000ポイントをサンプリングするプログラムを書いてください。それは実際に円周から選ばれている。円周から点(x、y)を生成するには、標準正規分布からのサンプル(x、y)を正規化する。

私のコードは正確ではないと確信していますが、これが私の所在地です。どんな助言も役に立つでしょう。

これは新しい更新コードですが、まだ動作していないようです。

import numpy as np 
import matplotlib.pyplot as plot 

def plot(): 

    xy = np.random.normal(0,1,(2000,2)) 

    for i in range(2000): 
     s=np.linalg.norm(xy[i,]) 
     xy[i,]=xy[i,]/s 

    plot.plot(xy) 
    plot.show() 

私はこの問題は、私が

plot.plot(xy[:,0],xy[:,1]) 

を使用している場合でも、それは動作しません

plot.plot(xy) 

であると思います。

+0

あなたの努力を示してください。あなたの宿題を単に投げ捨てるだけでは満足できません。 – cel

+1

@cel申し訳ありませんが、私は私の仕事をダンプするつもりはありませんでした。私は今編集し、自分のコードを追加しました。 – PolkaDot

+0

あなたは明らかにあなたのコードを試していません。実際にPythonインタプリタでこれを実行した場合、発見したバグがたくさんあります。本当の試みを見せて、あなたが試したこととうまくいかなかったことを教えてくれたら、私たちはあなたを助けます。しかし、私はあなたに何をしなければならないかを伝えることができます。 '(x、y)'のノルムを計算し、次に 'T =(x/norm、y/norm)'に変換することによって、単位円の円周に任意の点 'P =(x、y)'を投影することができます。 。この方法では原点までの距離が1になり、単位円上に位置します。 – cel

答えて

0

接続された線はここでは適切な視覚化ではありません。基本的に円のランダムな点を接続します。あなたはこれを非常に頻繁に行うので、塗りつぶされたサークルが得られます。代わりに描画ポイントを試してみてください。

名前空間のマングリングも避けてください。 matplotlib.pyplotplotとしてインポートし、関数名をplotとします。これは名前の競合につながります。

import numpy as np 
import matplotlib.pyplot as plt 

def plot(): 

    xy = np.random.normal(0,1,(2000,2)) 

    for i in range(2000): 
     s=np.linalg.norm(xy[i,]) 
     xy[i,]=xy[i,]/s 

    fig, ax = plt.subplots(figsize=(5,5)) 
    # scatter draws dots instead of lines 
    ax.scatter(xy[:,0], xy[:,1]) 

代わりにドットを使用すると、ポイントが実際に単位円に表示されます。

plot

0

あなたのコードでは、多くの問題があります。

  1. 問題テキストが均一(フラット)サンプリングについてですnp.random.normal(ガウス分布)を使用して、なぜ?

  2. 円の点を選択するには、xyを関連付ける必要があります。すなわちxyを無作為にサンプリングすると、x**2+y**2は1でなければならないので、円上に点が与えられません(例えば、(x=0, y=0)を中心とする単位円の場合)。

第二の点を得るためにいくつかの方法は[-1...1]x[-1...1]から単位円上またはその代わりに均一角度を選択し、円上の角度上の点を計算するためにいずれかの「プロジェクト」ランダムな点です。

0

まず、numpy.random.normalのドキュメントを参照すると(そして、numpy.random.randnを使用することもできます)、オプションのsizeパラメータを使用して、あなたが望むような配列の大きなもの。これを使用して、一度に多数の値を取得できます。たとえば、xy = numpy.random.normal(0,1,(2000,2))は、必要なすべての値を提供します。

その時点で、xy[:,0]**2 + xy[:,1]**2 == 1のように正規化する必要があります。これは、xy[:,0]**2 + xy[:,1]**2が何であるかを計算した後、比較的簡単になるはずです。個々の次元でノルムを単独で使用するだけでは機能しません。

0

それはxを参照する方が便利だように、通常の定型

import numpy as np 
import matplotlib.pyplot as plt 

は、2行のランダムなサンプルを生成年代とy

xy = np.random.normal(0,1,(2,2000)) 

は正常化ライブラリ関数を使用してノルムを計算するランダムサンプル、axis=0は、s最初の配列インデックスを変えて得られたubarrays、結果は、したがって単位円

結局
xy /= np.linalg.norm(xy, axis=0) 

に横たわって、単位ノルムを有する点を有することxy /=にブロードキャストすることができる(2000)状配列であり、プロット...ここでキーは、出力ユニットへのユーザー単位からスケールはそれが

を持つように、両方の軸の

plt.figure().add_subplot(111, aspect='equal').scatter(xy[0], xy[1]) 
pt.show() 

同じだということを必要とadd_subplot()方法、特にキーワード引数aspect='equal'です

a circle

関連する問題