如何标准化绘制点并获得圆?

时间:2016-05-01 07:32:05

标签: python numpy matplotlib

给定单位圆中的2000个随机点(使用numpy.random.normal(0,1)),我想将它们标准化,使输出为圆形,我该怎么做?

我被要求展示我的努力。这是一个更大问题的一部分:编写一个程序,从单位圆的圆周均匀地采样2000点。绘制并显示它确实是从圆周上挑选出来的。要从圆周生成一个点(x,y),从std正态分布中采样(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)

即使我使用

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

它没有用。

4 个答案:

答案 0 :(得分:0)

您的代码存在许多问题:

  1. 为什么在问题文本是关于统一(平面)采样时使用np.random.normal(高斯分布)?

  2. 要选择圆圈上的点,您需要关联xy;即随机抽样xy不会在圆圈上给出一个点,因为x**2+y**2必须为1(例如,以(x=0, y=0)为中心的单位圆)。

  3. 获得第二点的几种方法是从单位圆上的[-1...1]x[-1...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之后,这应该是相对微不足道的。仅仅在每个维度上单独使用规范是行不通的。

答案 2 :(得分:0)

此处连接的线条不是很好的可视化。你基本上连接圆圈上的随机点。由于你经常这样做,你会得到一个圆圈。请尝试绘制点。

还要避免名称空间损坏。您将matplotlib.pyplot导入为plot,并将您的函数命名为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

答案 3 :(得分:0)

常用样板

import numpy as np
import matplotlib.pyplot as plt

生成包含两行的随机样本,以便更方便地引用xy&#39>

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

使用库函数规范化随机样本以计算范数,axis=0意味着考虑获得的子数组改变第一个数组索引,结果是(2000)形状的数组,可以广播到{{ 1}}具有单位范数的点,因此位于单位圆上

xy /=

最后,情节......这里的关键是xy /= np.linalg.norm(xy, axis=0) 方法,特别是关键字参数 add_subplot(),它要求从用户单位到输出的比例两个轴的单位相同

aspect='equal'

拥有

a circle

相关问题