是否可以用NumPy重现MATLAB的randn()?

joo*_*oon 6 python matlab numpy scipy

我想知道是否有可能用NumPy精确地重现MATLAB的randn()的整个序列.我使用Python/Numpy编写了我自己的例程,并且它给了我一些与其他人所做的MATLAB代码不同的结果,并且由于不同的随机抽取,我很难找到它的来源.

我找到了numpy random.seed值,它为第一次绘制产生了相同的数字,但是从第二次绘制开始,它完全不同.我正在绘制多变量法则达20,000次,所以我不想只保存matlab绘制并用Python读取它.如果有任何其他方式,我想我必须这样做.请告诉我.

-Joon

Jen*_*unk 7

用户询问是否可以重现 Matlab 的 randn() 的输出,而不是 rand。我无法设置算法或种子来重现 randn() 的确切数字,但下面的解决方案对我有用。

在 Matlab 中:按如下方式生成正态分布的随机数:

rng(1);
norminv(rand(1,5),0,1)
ans = 
   -0.2095    0.5838   -3.6849   -0.5177   -1.0504
Run Code Online (Sandbox Code Playgroud)

在 Python 中:按如下方式生成正态分布的随机数:

import numpy as np
from scipy.stats import norm
np.random.seed(1)
norm.ppf(np.random.rand(1,5))
array([[-0.2095,  0.5838, -3.6849, -0.5177,-1.0504]])
Run Code Online (Sandbox Code Playgroud)

当从 Matlab 移动到 Python 或从 Matlab 移动到 Python 时,拥有可以重现相等随机数的函数非常方便。


seb*_*erg 5

如果将随机数生成器设置为相同的种子,理论上它将创建相同的数字,即在matlab中.我不太清楚如何做到最好,但这似乎工作,在matlab做:

rand('twister', 5489)
Run Code Online (Sandbox Code Playgroud)

并在numy中对应:

np.random.seed(5489)
Run Code Online (Sandbox Code Playgroud)

(重新)初始化你的随机数生成器.这为我提供了rand()和np.random.random()的相同数字,但是对于randn,我不确定是否有一个简单的方法.

使用较新的matlab版本,您可以设置一个与numpy具有相同属性的RandStream,对于较旧的,您可以在matlab中重现numpy的randn(反之亦然).Numpy使用极坐标形式从np.random.random()创建统一数字(这里给出的第二个算法:http://www.taygeta.com/random/gaussian.html ).您可以在matlab中编写该算法,以创建与matlab中的rand函数中的numpy相同的randn数.

如果你不需要大量的随机数,只需将它们保存在.mat中,然后从scipy.io中读取它们即可......