我在模拟体积中有大量元素,我称之为 RelDist
(其中维度是距离单位)。我试图确定“每单位体积的值数”的分布,这也是数密度。它应该类似于此图:
我知道轴是以 10 为底的对数缩放的,场景的情节肯定会下降。
在数学上,我将其设置为两个等价方程:
其中 N 是数组中根据距离的自然对数区分的元素数。也可以通过引入另一个r因子等价地改写成正则导数的形式。
等价地,
因此,对于不断增加的 r,我想计算每个 r 的对数 bin 中元素 N 的变化。
截至目前,我在设置直方图中的频率计数时遇到了问题,同时在它旁边容纳了音量。
尝试 1
这是使用 dN/dlnr/体积方程
def n(dist, numbins):
logdist= np.log(dist)
hist, r_array = np.histogram(logdist, numbins)
dlogR = r_array[1]-r_array[0]
x_array = r_array[1:] - dlogR/2
## I am condifent the above part of this code is correct.
## The succeeding portion does not work.
dR = r_array[1:] - r_array[0:numbins]
dN_dlogR = hist * x_array/dR
volume = 4*np.pi*dist*dist*dist
## The included volume is incorrect
return [x_array, dN_dlogR/volume]
绘制此图甚至无法像我在上面发布的第一个图那样正确显示分布,并且仅当我选择 bin 编号与我的输入数组形状相同时它才有效。包子的数量应该是任意的,不是吗?
尝试 2
这是使用等效的 dN/dr/volume 方程。
numbins = np.linspace(min(RelDist),max(RelDist), 100)
hist, r_array = np.histogram(RelDist, numbins)
volume = 4*np.float(1000**2)
dR = r_array[1]-r_array[0]
x_array = r_array[1:] - dR/2
y = hist/dR
稍微容易一些,但不包括体积项,我得到一种直方图分布,这至少是一个开始。
通过这种尝试,如何将体积项包含在数组中?
示例
从大约 10 的距离 R 值开始,计算相对于 R 的数字变化,然后增加到距离值 R 20,计算变化,增加到值 30,计算变化,依此类推等等。
如果您有兴趣重新创建它,这是我的阵列的 txt 文件
最佳答案
由于没有人能够帮助回答,我将提供我的结果,以备日后有人需要时使用:
def n_ln(dist, numbins):
log_dist = np.log10(dist)
bins = np.linspace(min(log_dist),max(log_dist), numbins)
hist, r_array = np.histogram(log_dist, bins)
dR = r_array[1]-r_array[0]
x_array = r_array[1:] - dR/2
volume = [4.*np.pi*i**3. for i in 10**x_array[:] ]
return [10**x_array, hist/dR/volume]
关于python - 一维数组的数密度分布 - 2 次不同的尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44561945/