Nsph上均匀分布随机点的生成算法

2024-05-13 17:45:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我还没有在Python上找到这种算法的实现

像这样:

有两个输入参数:

  • 空间的n维。在
  • m—n-1球面上的点数。在

我需要把它们大致均匀地排列在n球的表面上。在

坐标轴位于n-1球体的中心。 例如,在规则球体上的3d中,可以定位点like this

在我看来,Fibonacci算法在视觉上非常好。 我不知道n球是否有类似的东西。 我有512D空间,我要在里面放1000点甚至10000点。在

如何在python中实现这一点?在


Tags: 算法参数规则空间视觉this中心表面
1条回答
网友
1楼 · 发布于 2024-05-13 17:45:44

有一种简单的Muller and Marsaglia方法可以在超球面表面生成均匀分布。在

生成具有高斯分布的n个变量(在这里列出l)。它们形成了一些向量。在

求出该向量的长度,并将其分量规格化以提供单位长度的结果

示例显示了10d空间中球体上一个点的生成,还直观地检查了圆上点集合的均匀性(2d中的球体,hystogram值应接近)

import random, math

#muller-marsaglia method
def spherepicking(n):
    while True:           #to get rid off [0,0,0,0] case
        l = [random.gauss(0, 1) for i in range(n)]
        sumsq = sum([x * x for x in l])
        if sumsq > 0:
            break
    norm = 1.0 / math.sqrt(sumsq)
    pt = [x * norm for x in l]
    return pt

print(spherepicking(10))

cnt = [0] * 18
for i in range(10000):
   pt = spherepicking(2)
   an = math.atan2(pt[1], pt[0]) + math.pi / 2
   cnt[math.floor(an * 9 / math.pi)] += 1
print(cnt)

-0.31811419572739935, 0.2845442135156396, -0.2849019746359018,
-0.1326796017012003, 0.7388447238721524, -0.287062305232526, 
-0.08794741714783766, 0.131707880836534, 0.22059937624019868, 
-0.13047162618106062]

[554, 560, 529, 589, 534, 538, 550, 558, 578, 556, 522, 553, 561, 513, 592, 583, 593, 537]

相关问题 更多 >