【问题标题】:Points that follow a 1/R density distribution in an XY grid?在 XY 网格中遵循 1/R 密度分布的点?
【发布时间】:2016-07-04 01:16:42
【问题描述】:

我有一个 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 对应于 2 个质量为 150 单位的点质量。我还需要使用这些点进行后续计算,所以我也想知道如何使用更通用的格式,而不是使用 'a'、'b'、'c' 来表示 n 点质量。

感谢您的帮助。

【问题讨论】:

  • 我不是 100% 确定我真的理解您的问题,但您可能想为 zetaM 创建列表或数组,例如 zeta = [(25,25), (-10,5), ...]M = [150, 150, ...],然后您可以使用作为 zeta[n]M[n] 来处理第 n 个点质量。
  • 是的,我的问题是如何为 zeta 生成一个列表/数组,它遵循 1/R(距中心的距离)的密度分布,这些值可以是完全任意的。
  • 1/R 在 xy 平面上的(双)积分是无限的。要成为概率密度函数 (pdf),积分必须等于 1——或者至少是常数。所以我认为你正在寻找的是不可能的。对于某些epsilon > 0,pdf 必须下降为1/R**(2+epsilon),才能使pdf 可积分。
  • 对,我想过,但我只是希望它是一个近似值,说只要它不超过 1/R,它不一定必须是 1/R。此外,不是设置无限数量的点,我不能选择某个有限数量,并分配它们遵循 1/R 分布的近似值吗?我所说的密度就是点的分布

标签: python numpy grid distribution


【解决方案1】:

假设我理解你的问题(如果不是,欢迎 cmets):

创建任何给定分布的方法是对分布 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])

【讨论】:

  • 我也在考虑用极坐标生成,但还没来得及撰写答案。对于半径,我建议使用带有形状参数 Gamma distribution,因为 1) Python 已经有了它,并且 2) 可以调整形状参数以更好地接近任何真实数据。
  • 哇,谢谢,这是一个开始!我确实遵循了您所做的最初部分,但仍然需要熟悉使用的功能,但是我将如何为这些点分配值?表示质量的值,如果它们都具有相同的值会很好,但我需要为它们分配一个值......另外,我不确定如何在我的计算中使用这种形式的点,因为例如,现在,在我的原始帖子中,我的观点是 zeta_a 和 zeta_b,我必须执行 zeta_min_a_x = X - zeta_a[0],对于 y 分量也是如此,然后对 b 再次重复此操作。
  • 换句话说,我希望能够使用 plt.contourf(X,Y,z) 来查看这些点,用 z 来描述它们......我不确定如何使用直方图来做到这一点
  • 这取决于你想做什么。这些点的 x 和 y 是长向量。您可以创建一个长度相同的向量 m 来容纳质量。或者,您可以创建一个新的数据结构并为其分配坐标和质量。
  • 我想要做的只是将这些点作为坐标来放置我的点质量,然后用它进行计算,就像我之前给出的示例一样。所以我猜这个,它必须创建一个新的数据结构?基本上,我希望它们成为我分配'z'的坐标,然后能够用contourf绘制它,我想我可以以与开始类似的方式执行我的计算.. ..你认为这可以通过创建一个新的数据结构来实现吗?我不知道该怎么做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2017-11-09
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
相关资源
最近更新 更多