生成数组的排列

问题描述 投票:0回答:2

我想生成一个(任意长度的)数组列表,每个数组都是随机排列

A
。来自这个问题

for x in range(n):
    random.shuffle(A)
    routes.append(A)

如何使用 NumPy 有效地做到这一点?

python numpy random permutation
2个回答
0
投票

考虑这个例子:

In [59]: crr
Out[59]: 
array([[0.83704624, 0.42109715, 0.50779425, 0.93753455, 0.11773652,
        0.08751938],
       [0.83704624, 0.42109715, 0.50779425, 0.93753455, 0.11773652,
        0.08751938],
       [0.83704624, 0.42109715, 0.50779425, 0.93753455, 0.11773652,
        0.08751938],
       [0.83704624, 0.42109715, 0.50779425, 0.93753455, 0.11773652,
        0.08751938],
       [0.83704624, 0.42109715, 0.50779425, 0.93753455, 0.11773652,
        0.08751938]])

In [60]: np.random.shuffle(crr[0])

In [61]: crr
Out[61]: 
array([[0.42109715, 0.50779425, 0.93753455, 0.11773652, 0.08751938,
        0.83704624],
       [0.83704624, 0.42109715, 0.50779425, 0.93753455, 0.11773652,
        0.08751938],
       [0.83704624, 0.42109715, 0.50779425, 0.93753455, 0.11773652,
        0.08751938],
       [0.83704624, 0.42109715, 0.50779425, 0.93753455, 0.11773652,
        0.08751938],
       [0.83704624, 0.42109715, 0.50779425, 0.93753455, 0.11773652,
        0.08751938]])

由于随机洗牌是就地的,所以这里我们只能指定要洗牌的第一行。因此,如果你使用

np.repeat
np.tile
重复你的 A N 次,并将结果重塑为像这里的
crr
这样的二维数组,你可以这样做来达到最终目标:

In [69]: for v in crr:
    ...:     np.random.shuffle(v)

0
投票

np.random.permutation
怎么样?例如:

A = np.array([0, 1, 2, 3, 4])
n = 17  # list length
x = [np.random.permutation(A)  for i in range(n)]

我认为不可能避免循环

n
迭代的程序方面,但如上面的代码片段所示:

  • 使用
    np.random.permutation
    避免使用
    random
  • 使用列表理解来避免多行循环
© www.soinside.com 2019 - 2024. All rights reserved.