どのように純粋なnumpyのソリューションについて:
from math import factorial as fac
import numpy as np
def permmat(n):
if n==1:
return np.array([[1]], dtype=np.int8)
fnm1 = fac(n-1)
pmat_nm1 = permmat(n-1)
pmat = np.empty((n, fac(n)), dtype=np.int8)
pmat[0] = np.repeat(np.arange(n,0,-1), fnm1)
pmat[1:, :fnm1] = pmat_nm1
for i in range(1,n):
view = pmat[1:, fnm1*i:fnm1*(i+1)]
view[:,:] = pmat_nm1
view[pmat_nm1==(n-i)] = n
return pmat
print(permmat(4))
出力:あり、まだいくつかのパフォーマンスのハックのためのスペースだが、私はあまりにもだ
[[4 4 4 4 4 4 3 3 3 3 3 3 2 2 2 2 2 2 1 1 1 1 1 1]
[3 3 2 2 1 1 4 4 2 2 1 1 3 3 4 4 1 1 3 3 2 2 4 4]
[2 1 3 1 2 3 2 1 4 1 2 4 4 1 3 1 4 3 2 4 3 4 2 3]
[1 2 1 3 3 2 1 2 1 4 4 2 1 4 1 3 3 4 4 2 4 3 3 2]]
それらを書くのは怠惰です。
何numpyの配列に 'itertools.permutations'を供給についてはどうですか? –
@YakymPirozhenkoは 'itertools'をインポートせずにこれを行うことができますか? – Apollo
順列のリストを生成する独自の関数を記述しない限り、そうではありません。また、 'itertools'は組み込みモジュールなので、明示的な制限がない限り、インポートには大きな欠点はありません。 –