不含Python for循环的排列数组



假设我有一个数组

import numpy as np
arr = np.array([1, 1, 2, 2, 3, 3, 4, 4])

我想要一个数组,其中arr的许多随机排列作为其行。下面是一个可行的解决方案:

np.array([np.random.permutation(arr) for _ in range(100_000)])

但是,这比生成相同形状的随机整数数组要慢,后者不涉及Python的for循环:

In [15]: %%timeit
...: np.random.randint(1, 5, size=(100_000, 8))
...: 
...: 
10 ms ± 102 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [16]: %%timeit
...: np.array([np.random.permutation(arr) for _ in range(100_000)])
...: 
...: 
1.06 s ± 9.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

是否有一种方法可以对其进行矢量化,从而在我想要生成的排列数量增加时不会减慢太多速度?

我认为numpy.random.Generator.permuted解决了你的问题:

import numpy as np
arr = np.array([1, 1, 2, 2, 3, 3, 4, 4])
n = 10
arr = np.tile(arr, (n, 1))
rng = np.random.default_rng()
rng.permuted(arr, axis=1)

输出:

array([[4, 2, 3, 4, 3, 1, 2, 1],
[3, 2, 4, 1, 1, 3, 4, 2],
[2, 3, 3, 4, 1, 4, 2, 1],
[2, 3, 1, 3, 1, 4, 4, 2],
[2, 1, 2, 1, 4, 4, 3, 3],
[3, 2, 3, 4, 2, 1, 1, 4],
[2, 2, 3, 1, 4, 3, 1, 4],
[1, 3, 3, 4, 1, 2, 2, 4],
[4, 2, 3, 3, 1, 1, 2, 4],
[1, 1, 2, 3, 4, 4, 2, 3]])

最新更新