在XY网格中遵循1 / R密度分布的点?

时间:2016-07-02 15:51:20

标签: python numpy grid distribution

我有一个XY网格,其中一些网格点具有分配给它们的特定值,在这种情况下,每个值意味着一定的质量,因此基本上指向网格中的质量。我现在想要获得一组遵循密度分布1 / R的点,其中R是距中心的距离,因此R = sqrt(x ^ 2 + y ^ 2)。通过密度分布,我的意思是点数必须下降为1 / R.我该怎么做呢?

我的代码如下:

import numpy as np
x = np.linspace(-50,50,100)
y = np.linspace(-50,50,100)
X, Y = np.meshgrid(x,y)
zeta_a = (25,25)
zeta_b = (-10,5) 
M_a = 150
M_b = 150 

zeta_a和zeta_b对应于具有150个单位质量的2点质量。我还需要使用这些点进行跟进计算,所以我也想知道如何使用更通用的格式而不是使用'a','b','c'来表示n点质量。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

假设我理解你的问题(如果不欢迎评论):

创建任何给定分布的方法是通过在分布CDF的逆上进行插值。这是我的职责:

import numpy as np
import matplotlib.pyplot as plt

def randdist(PDF, x, n):
    """Create a distribution following PDF(x). PDF and x
    must be of the same length. n is the number of samples."""
    fp = np.random.rand(n,)
    CDF = np.cumsum(PDF)
    return np.interp(fp, CDF, x)

现在,在你的情况下,我们将在极坐标中工作,R分布为1 / r,Theta均匀分布:

num = 1000   # The number of points
r = np.linspace(-50, 50, 100)
PDF = np.abs(1/r)
PDF = PDF/np.sum(PDF)    # PDF should be normalized
R = randdist(PDF, r, num)
Theta = 2*np.pi*np.random.rand(num,)

现在让我们创建点x和y向量

x = [R[k]*np.cos(Theta[k]) for k in range(num)]
y = [R[k]*np.sin(Theta[k]) for k in range(num)]

绘制

plot(x,y,'.')

plot

请注意,在我的回答中,r = 50处存在硬截止。有办法克服这一点,但现在我保持原样。

现在你似乎也希望将点嵌入2D网格中,就像直方图一样。您可以使用

执行此操作
z, _, _ = np.histogram2d(x, y, [100, 100])