Sad*_*daf 5 python random numpy complex-numbers
对于我的研究,我需要生成均匀的随机复数。如何在 python 中执行此操作,因为没有这样的模块来生成复数。
小智 12
你的问题没有明确说明,你需要说出你想要从复平面的哪个区域绘制均匀分布的数字。对于均匀采样实数,这也是正确的。然而,在实际情况中,有一个非常明显的选择,即区间[0, 1)。例如,您可以看到numpy.random.uniform此间隔中的默认样本。
我将为复杂平面的区域提供一些可能有用的解决方案,但最终,适合您的选择将取决于您的应用程序。
假设np是numpy并且我们想要生成一个由许多这样的形状为 的随机数组成的数组shape。
即从所有复数 z 中均匀采样,使得实部和虚部都在 [-1,1] 内。您可以生成这样的复数,例如通过
np.random.uniform(-1, 1, shape) + 1.j * np.random.uniform(-1, 1, shape)
Run Code Online (Sandbox Code Playgroud)
即从绝对值在[0,1]之间的所有复数中均匀采样。您可以生成它们,例如
np.sqrt(np.random.uniform(0, 1, shape)) * np.exp(1.j * np.random.uniform(0, 2 * np.pi, shape))
Run Code Online (Sandbox Code Playgroud)
解释:我们可以将圆盘中的点参数化为 z = r * exp(ia)。z在圆盘中的均匀分布意味着角度a在[0, 2pi]范围内均匀,但半径不均匀(直觉:圆盘中半径较大的点比半径小的点多)。半径在区间 [0, 1] 上的概率密度为 p(r) = 2r,CDF(p(r) 的积分)为 F(r) = r^2,逆 CDF 采样允许我们对 X = F^{-1}(Y) = sqrt(Y) 等半径进行采样,其中 Y 均匀分布。
小智 -6
这样做还不够吗:
a = np.random.uniform(1,10,10)
b = a + a * <some constant>j
Run Code Online (Sandbox Code Playgroud)
我认为这保持统一。
array([7.51553061 +9.01863673j, 1.53844779 +1.84613735j,
2.33666459 +2.80399751j, 9.44081138+11.32897366j,
7.47316887 +8.96780264j, 6.96193206 +8.35431847j,
9.13933486+10.96720183j, 2.10023098 +2.52027718j,
4.70705458 +5.6484655j , 8.02055689 +9.62466827j])
Run Code Online (Sandbox Code Playgroud)