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

时间:2010-09-15 21:50:32

标签: python matlab numpy scipy

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

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

-Joon

3 个答案:

答案 0 :(得分:5)

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

rand('twister', 5489)

并在numy中对应:

np.random.seed(5489)

要(重新)初始化你的随机数生成器。这为我提供了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中读取它们......

答案 1 :(得分:3)

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

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

rng(1);
norminv(rand(1,5),0,1)
ans = 
   -0.2095    0.5838   -3.6849   -0.5177   -1.0504

在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]])

从Matlab移动到Python,反之亦然,拥有可以重现相等随机数的函数非常方便。

答案 2 :(得分:2)

只是想进一步澄清使用twister / seeding方法:MATLAB和numpy使用此种子生成相同的序列,但会以不同方式填充它们。

MATLAB 填写矩阵向下列,而 python 向下行。因此,为了在两者中获得相同的矩阵,您必须转置:

MATLAB:

rand('twister', 1337);
A = rand(3,5)
A = 
 Columns 1 through 2
   0.262024675015582   0.459316887214567
   0.158683972154466   0.321000540520167
   0.278126519494360   0.518392820597537
  Columns 3 through 4
   0.261942925565145   0.115274226683149
   0.976085284877434   0.386275068634359
   0.732814552690482   0.628501179539712
  Column 5
   0.125057926335599
   0.983548605143641
   0.443224868645128

蟒:

import numpy as np
np.random.seed(1337)
A = np.random.random((5,3))
A.T
array([[ 0.26202468,  0.45931689,  0.26194293,  0.11527423,  0.12505793],
       [ 0.15868397,  0.32100054,  0.97608528,  0.38627507,  0.98354861],
       [ 0.27812652,  0.51839282,  0.73281455,  0.62850118,  0.44322487]])

注意:我也在这个类似的问题上提出了这个答案:Comparing Matlab and Numpy code that uses random number generation