joo*_*oon 6 python matlab numpy scipy
我想知道是否有可能用NumPy精确地重现MATLAB的randn()的整个序列.我使用Python/Numpy编写了我自己的例程,并且它给了我一些与其他人所做的MATLAB代码不同的结果,并且由于不同的随机抽取,我很难找到它的来源.
我找到了numpy random.seed值,它为第一次绘制产生了相同的数字,但是从第二次绘制开始,它完全不同.我正在绘制多变量法则达20,000次,所以我不想只保存matlab绘制并用Python读取它.如果有任何其他方式,我想我必须这样做.请告诉我.
-Joon
用户询问是否可以重现 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 时,拥有可以重现相等随机数的函数非常方便。
如果将随机数生成器设置为相同的种子,理论上它将创建相同的数字,即在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中读取它们即可......