我有一个 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]]
有人对如何实现这一目标有任何想法/解决方案吗?
你的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]
如果你的排列适合记忆,你可以将它们存储在
set
中,从而只获得可区分的排列。
from itertools import permutations
a = [0, 1, 0, 2]
perms = set(permutations(a))
其他答案没有回答问题,它们的输出与示例不匹配。该问题要求应用数组中值 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。请参阅整数数组索引