如何在python中为球坐标中的某些点生成高斯分布偏移的新点

如何在python中为球坐标中的某些点生成高斯分布偏移的新点,python,numpy,gaussian,Python,Numpy,Gaussian,我正在处理球坐标中的一些点。我需要生成新点作为它们的错误点,并为旧点生成一种偏移。 新点应与按高斯分布分布的旧点保持一定距离。与旧点相比,新点的角度并不重要。我正在尝试为r方向生成新点。无论φ和θ是什么(球坐标) 为了通过高斯函数生成新的点分布,我尝试了numpy.rand.normal(mean,std,…)。但它是在平均值上生成一维随机点,这个平均值是一个实数。在我的例子中,我需要一种方法来指定旧点的位置,并且我有一个给定的标准偏差来表示与原始点的距离 老实说,我没有我的密码副本。它在大学的

我正在处理球坐标中的一些点。我需要生成新点作为它们的错误点,并为旧点生成一种偏移。 新点应与按高斯分布分布的旧点保持一定距离。与旧点相比,新点的角度并不重要。我正在尝试为r方向生成新点。无论φ和θ是什么(球坐标)

为了通过高斯函数生成新的点分布,我尝试了numpy.rand.normal(mean,std,…)。但它是在平均值上生成一维随机点,这个平均值是一个实数。在我的例子中,我需要一种方法来指定旧点的位置,并且我有一个给定的标准偏差来表示与原始点的距离

老实说,我没有我的密码副本。它在大学的服务器上。但我们假设有一个大小为100*3的数组,包括圆柱体表面上某些点的球面(或笛卡尔)坐标。在球面情况下,第一列表示半径值,第二列表示θ,第三列表示点的φ。现在我想用高斯分布从中生成随机点。高斯分布有一个给定的标准偏差。唯一重要的是,由高斯分布生成的新点在r值上是有限的。无论点在θ和φ中的位置如何。 当我尝试numpy.rand.normal(mean,std,…)时,这会在平均值上生成一些随机点。这对我没有帮助。我想要新的点超过我的旧点

任何想法都将不胜感激

这是一个代码,类似于Ophion编写的我的代码

def make_圆柱体(半径、长度、长度、阿尔法、纳尔法、中心、方向):

现在调用函数: 西格玛=0.5#给定标准
ossfet_points=numpy.random.normal(np.mean(point[:,0]),sigma,size=(n,3))

如果我没弄错的话,你想要一个球面流形上的随机点,距离中心的分布是高斯分布。如果是这样,那么使用
numpy.rand.normal

获取随机球形点稍微有点棘手,但这里有一些代码可以实现这一点(以及下面的数学描述):

这会给你这样的分数:

radii = np.random.normal(10, 3, 100)
points = np.array([spherical_to_cartesian([r, 2 * np.pi * u, np.arccos(2*v - 1)]) for r,u,v in zip(radii, U,V)])

现在,如果希望它们具有正态分布的半径,只需替换列表中随机生成的值,该列表使用如下可变半径:

radii = np.random.normal(10, 3, 100)
points = np.array([spherical_to_cartesian([r, 2 * np.pi * u, np.arccos(2*v - 1)]) for r,u,v in zip(radii, U,V)])

这或多或少是您想要的吗?

您能提供迄今为止使用过的任何代码吗?目前还不清楚你在问什么。我编辑了我的描述。如果仍然模棱两可,请让我知道。这是一堵文字墙:P你应该试着提供一个答案,这样人们才能真正帮助你。这意味着要提供实际的代码和一个简短、简洁的解释,说明你想做什么。我也不明白你想要什么。numpy提供标准正态发生器,因为您应该能够使用它从任何高斯分布中获取样本。为什么不多次调用
randn
,其中
mu
是旧点?在柱面上生成点与您的问题有什么关系?很多人都感谢Jupiter。。也许我可以从你的代码中得到一些提示。但这不是我要找的。在本例中,您将从球体的中心生成一些点。如果你想为这些蓝色点生成随机点,你会怎么做?在我的例子中,我已经在圆柱体的表面上生成了一些点,比如你的例子中的蓝色点,我正在尝试在3D中为这些蓝色点生成噪波。将蓝色点添加到你想要偏移的点。也就是说,
new_points=圆柱体_points+球体_points
它能工作吗?我需要一种圆柱表面上的随机点。。我想,通过加上这两个点集,我混合了两个点集……你将生成与原始点有一定距离且方向随机的点。如果半径与圆柱体的大小相比很小,则生成的点聚合应该看起来像一个摆动的圆柱体(有一些错误的圆柱体)。
import numpy as np

num_points = 500
U = np.random.random(num_points)
V = np.random.random(num_points)

import math as m

def spherical_to_cartesian(vec):                                                  
    '''
    Convert spherical polar coordinates to cartesian coordinates:                       

    See the definition of spherical_cartesian_to_polar.                                 

    @param vec: A vector of the 3 polar coordinates (r, u, v)                           
    @return: (x, y, z)                                                                  
    ''' 
    (r, u, v) = vec                                                                     

    x = r * m.sin(u) * m.cos(v)                                                         
    y = r * m.sin(u) * m.sin(v)                                                         
    z = r * m.cos(u)                                                                    

    return [x, y, z]  

radius = 1.
points = np.array([spherical_to_cartesian([radius, 2 * np.pi * u, np.arccos(2*v - 1)]) for u,v in zip(U,V)])

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax = Axes3D(fig)

ax.plot(points[:,0], points[:,1], points[:,2], 'o')
radii = np.random.normal(10, 3, 100)
points = np.array([spherical_to_cartesian([r, 2 * np.pi * u, np.arccos(2*v - 1)]) for r,u,v in zip(radii, U,V)])