给定单位圆中的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])
它没有用。
答案 0 :(得分:0)
您的代码存在许多问题:
为什么在问题文本是关于统一(平面)采样时使用np.random.normal
(高斯分布)?
要选择圆圈上的点,您需要关联x
和y
;即随机抽样x
和y
不会在圆圈上给出一个点,因为x**2+y**2
必须为1(例如,以(x=0, y=0)
为中心的单位圆)。
获得第二点的几种方法是从单位圆上的[-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])
如果你改用点,你会看到你的点确实位于单位圆上。
答案 3 :(得分:0)
常用样板
import numpy as np
import matplotlib.pyplot as plt
生成包含两行的随机样本,以便更方便地引用x
和y
&#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'
拥有