Получить все перестановки массива 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]]

Есть ли у кого-нибудь идеи / решения о том, как этого добиться?

2 ответа

Решение

Ваш 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()
for perm in permutations(a):
    perms.add(perm)

print(perms)

или - как указал John Coleman - в одной строке:

perms = set(permutations(a))
Другие вопросы по тегам