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



numpy 中是否有一些简单的工具可以给定一个值 x 返回三个模数为 x 的随机坐标?

好吧,我认为您不会为此目的在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评论。

假设你想要 3 维笛卡尔坐标(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]

最新更新