我有一个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点质量。
感谢您的帮助。
答案 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,'.')
请注意,在我的回答中,r = 50处存在硬截止。有办法克服这一点,但现在我保持原样。
现在你似乎也希望将点嵌入2D网格中,就像直方图一样。您可以使用
执行此操作z, _, _ = np.histogram2d(x, y, [100, 100])