Numpy,给定范数,返回可能的笛卡尔坐标

3
有没有一些简单的工具在numpy中,给定一个值x,返回三个模数为x的随机坐标?
2个回答

2

嗯,我不认为你会在numpy中找到这个目的的东西,但这将非常快:

from numpy.random import normal
from numpy.linalg import norm
from numpy import allclose
def random_vec(modulus):
    while True:
        y = normal(size=(3,))
        if not allclose(y,0):
            y *= modulus / norm(y)
            return y

我假设你所说的向量模块是指L2范数。请注意,我们必须检查至少一个坐标不接近于零(或为零!),以便在重新缩放组件时不会出现数值舍入问题。

编辑:现在使用normal()而不是rand()

我们从正态分布中选择坐标(然后当然重新缩放它们)以获得半径为modulus的球上的随机点的原因在此解释。也请阅读下面的unutbu评论。


如果您使用np.random.normal(size=(3,1))而不是np.random.rand(3),那么生成的点将在球体上均匀分布。 - unutbu
如果您使用 rand(3),那么您选择的是单位立方体上的一个点,然后将其投影到球体上。这会使得在侧面附近有更多的点,而在角落附近则较少。 - unutbu

0

假设您想要三维笛卡尔坐标系中的(X,Y,Z),您可以通过在球极坐标系中进行两个随机角度选择,然后转换回笛卡尔坐标系来实现:

import numpy as np

# Example data: three values of x = sqrt(X^2 + Y^2 + Z^2)
x = np.array([1, 2, 2.5])

n = len(x)
theta = np.arccos(2 * np.random.random(n) - 1)
phi = np.random.random(n) * 2. * np.pi

X = x * np.sin(theta) * np.cos(phi)
Y = x * np.sin(theta) * np.sin(phi)
Z = x * np.cos(theta)

例如,给出:

[-2.60520852  0.01145881  1.01482376]
[-0.85300437  0.29508229 -1.54315779]
[ 1.21871742 -0.95540313  3.54806944]

一条注释:这样做可以使 phi 真正随机,而 cos(phi)sin(phi) 是一个随机变量的函数,因此坐标不像 phi 一样技术上是随机的。 - gg349

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接