I have searched on stackoverflow for people facing similar issues and this topic Replicating MATLAB's `randperm` in NumPy is the most similar.

然而,尽管可以使用NumPy随机排列在Python 中重新创建MatLab中的随机数函数的行为,但是生成的数字并不相同,即使我为两种语言 Select 了相同的种子生成器.我有点困惑,因为我的测试是与其他随机函数相关的,在MatLab和Python 之间.

以下是我try 过的:

MatLab

rng(42);
randperm(15)

它会返回

ans =

    11     7     6     5    15    14     1     4     9    10     3    13     8     2    12

Python

np.random.seed(42)
print(np.random.permutation(range(1,16)))

它会返回

[10 12  1 14  6  9  3  2 15  5  8 11 13  4  7]

How can I change my Python code so it can reproduce the same order of random numbers than MatLab ?

推荐答案

似乎MatLab和Numpy默认使用same random number generators,而这一差异是由两种语言中的inner workings of 100 being different造成的.

在旧的MatLab版本中,randperm的工作方式是生成一个随机数组并输出使该数组排序的索引(使用sort的第二个输出).在更现代的MatLab版本中(我使用的是R2017b),randperm是一个内置函数,所以看不到源代码,但它似乎使用了相同的方法:

>> rng('default')
>> rng(42)
>> randperm(15)
ans =
    11     7     6     5    15    14     1     4     9    10     3    13     8     2    12
>> rng(42)
>> [~,  ind] = sort(rand(1,15))
ind =
    11     7     6     5    15    14     1     4     9    10     3    13     8     2    12

因此,如果随机数生成器在两种语言中实际上是相同的(似乎是这样),您可以在Numpy中复制这种行为,方法是使用argsort定义您自己的randperm版本:

>>> import numpy as np
np.random.seed(42)
ind = np.argsort(np.random.random((1,16)))+1
print(ind)
[[11  7  6  5 15 16 14  1  4  9 10  3 13  8  2 12]]

然而,请注意,依赖两种语言中相同的随机数生成器是有风险的,而且可能依赖于版本.

Python相关问答推荐

使用新的类型语法正确注释ParamSecdecorator (3.12)

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

Django mysql图标不适用于小 case

scikit-learn导入无法导入名称METRIC_MAPPING64'

什么相当于pytorch中的numpy累积ufunc

如何制作10,000年及以后的日期时间对象?

Polars:用氨纶的其他部分替换氨纶的部分

基于索引值的Pandas DataFrame条件填充

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

在单个对象中解析多个Python数据帧

joblib:无法从父目录的另一个子文件夹加载转储模型

名为__main__. py的Python模块在导入时不运行'

判断solve_ivp中的事件

基于形状而非距离的两个numpy数组相似性

在Google Drive中获取特定文件夹内的FolderID和文件夹名称

Python:在cmd中添加参数时的语法

如何计算Pandas 中具有特定条件的行之间的天差

Django查询集-排除True值

搜索结果未显示.我的URL选项卡显示:http://127.0.0.1:8000/search?";,而不是这个:";http://127.0.0.1:8000/search?q=name";