获取numpy数组的所有排列

MBr*_*own 9 python numpy

我有一个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]]
Run Code Online (Sandbox Code Playgroud)

有没有人有任何关于如何实现这一目标的想法/解决方案?

Bil*_*ell 19

你的a是组合者称之为multiset的东西.该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]
Run Code Online (Sandbox Code Playgroud)

  • 不知道这个。学到了新东西!谢谢!+1 (2认同)
  • 这也是我来到这里的一个重要原因! (2认同)

hir*_*ist 13

如果您的排列符合内存,则可以将它们存储在a中set,从而只获得可区分的排列.

from itertools import permutations

a = [0, 1, 0, 2]

perms = set()
for perm in permutations(a):
    perms.add(perm)

print(perms)
Run Code Online (Sandbox Code Playgroud)

或者 - 由John Coleman精心制作- 在一行中:

perms = set(permutations(a))
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一下 - `set(permutations(a))`是你想法的一行实现. (6认同)
  • 对于小例子来说这可能没问题,但这涉及到生成 n!当可区分排列的数量可能少得多时的排列 (2认同)