获取 numpy 数组的所有排列

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

我有一个 numpy 数组 [0, 1, 1, 2, 2, 0, 1, ...],其中仅包含数字 0-k。我想创建一个新数组,其中包含 n 个可能的 0-k 排列数组。一个 k=2 和 n=6 的小例子:

a = [0, 1, 0, 2]
permute(a)
result = [[0, 1, 0, 2]
          [0, 2, 0, 1]
          [1, 0, 1, 2]
          [2, 1, 2, 0]
          [1, 2, 1, 0]
          [2, 0, 2, 1]]

有人对如何实现这一目标有任何想法/解决方案吗?

python numpy
3个回答
55
投票

你的a就是组合学家所说的多重集sympy 库有 各种例程 可以使用它们。

>>> from sympy.utilities.iterables import multiset_permutations
>>> import numpy as np
>>> a = np.array([0, 1, 0, 2])
>>> for p in multiset_permutations(a):
...     p
...     
[0, 0, 1, 2]
[0, 0, 2, 1]
[0, 1, 0, 2]
[0, 1, 2, 0]
[0, 2, 0, 1]
[0, 2, 1, 0]
[1, 0, 0, 2]
[1, 0, 2, 0]
[1, 2, 0, 0]
[2, 0, 0, 1]
[2, 0, 1, 0]
[2, 1, 0, 0]

36
投票

如果你的排列适合记忆,你可以将它们存储在

set
中,从而只获得可区分的排列。

from itertools import permutations

a = [0, 1, 0, 2]

perms = set(permutations(a))

0
投票

其他答案没有回答问题,它们的输出与示例不匹配。该问题要求应用数组中值 0,1,2 的所有排列。

这是一种方法:

import numpy as np
from itertools import permutations

a = [0, 1, 0, 2]
ps = np.array(list(permutations([0,1,2])))
result = ps[:,a]

结果,与问题中的示例匹配:

array([[0, 1, 0, 2],
       [0, 2, 0, 1],
       [1, 0, 1, 2],
       [1, 2, 1, 0],
       [2, 0, 2, 1],
       [2, 1, 2, 0]])

解释:数组

ps

array([[0, 1, 2],
       [0, 2, 1],
       [1, 0, 2],
       [1, 2, 0],
       [2, 0, 1],
       [2, 1, 0]])

ps[:,[0,1,0,2]]
将为每行选择项目 0, 1, 0, 2。请参阅整数数组索引

© www.soinside.com 2019 - 2024. All rights reserved.