numpy 在Python中重新创建randperm Matlab函数

1bqhqjot  于 2023-10-19  发布在  Python
关注(0)|答案(1)|浏览(187)

我在stackoverflow上搜索过面临类似问题的人,这个主题Replicating MATLAB's randperm in NumPy是最相似的。
然而,尽管可以在Python中使用numpy random permutation从Matlab中重新创建randperm函数的行为,但生成的数字并不相同,即使我为两种语言选择了相同的种子生成器。我有点困惑,因为我的测试与Matlab和Python之间的其他随机函数相关。
以下是我尝试过的:
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]

我怎样才能改变我的Python代码,使它可以重现与Matlab相同的随机数顺序?

gajydyqb

gajydyqb1#

看起来Matlab和Numpy默认使用相同的随机数生成器,差异是由于两种语言中randperm内部工作方式不同造成的。
在旧的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

因此,如果两种语言中的随机数生成器实际上是相同的,那么您可以通过使用argsort定义自己的randperm版本来在Numpy中复制这种行为:

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

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

相关问题