【问题标题】:How to get a random permutation of integers inside range without permuting the whole array in python?如何在不排列python中的整个数组的情况下获得范围内整数的随机排列?
【发布时间】:2021-06-28 03:42:05
【问题描述】:

假设我有一个很长的数组,并且我想返回该数组子集的随机排列...如何在不必排列整个数组的情况下做到这一点?

我能想到的方式是

import numpy
N = 10000000 # total number of elements
n = 20 # number of elements that I am interested in getting from the permutation
x = numpy.random.permutation(numpy.arange(N))[:n] # this permutes the whole array

基本上,我需要选择大于或等于0且小于N的唯一整数n...

我知道明确地做到这一点很容易,但是 python 中的任何模块中是否有 numpy 方式或函数可以像 MATLAB 中的 randperm(N,n) 一样工作?

到目前为止,我只找到了与我在此处描述的内容不同的 Python 示例。

【问题讨论】:

标签: python arrays numpy random permutation


【解决方案1】:

如果您有一个用于超长数组的惰性生成器,则使用标准 random module 可能更有效。

N = 10000000

import numpy as np
%timeit np.random.choice(range(N), size=20, replace=False)
# 1.52 s ± 20.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit np.random.choice(np.arange(N), size=20, replace=False)
# 376 ms ± 3.95 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

import random
%timeit np.array(random.sample(range(N), k=20))
# 19 µs ± 86.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

因此,如果您有一个生成器/迭代器而不是内存中的数组,那么random 模块可以明显更快。

但是,如果您特别想获得介于 0N 之间的 k 数字,最简单的方法可能是使用类似

%timeit np.random.choice(N, size=20, replace=False)
# 410 ms ± 12.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

虽然速度稍慢。

【讨论】:

    【解决方案2】:

    假设您已经拥有arr,则可以使用np.random.choice(arr, size=20, replace=False)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-02
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2017-11-02
      相关资源
      最近更新 更多