【问题标题】:Create permutation matrix - numpy创建置换矩阵 - numpy
【发布时间】:2017-04-12 19:19:51
【问题描述】:

给定一个整数k,我将如何创建一个具有序列1k 的所有可能排列的排列矩阵?例如,让我们考虑k=2。然后我想创建矩阵:

1 2
2 1

对于k=3

1 1 2 2 3 3
2 3 1 3 1 2 
3 2 3 1 2 1

我尝试过使用numpy.random.permutation,但这只会产生一个排列。所以,我可以继续使用这个函数,添加唯一的排列,直到列数等于k!,但这似乎非常低效。

【问题讨论】:

  • itertools.permutations 输入一个numpy 数组怎么样?
  • @YakymPirozhenko 是否可以在不导入 itertools 的情况下做到这一点?
  • 好吧,除非您想编写自己的函数来生成排列列表,否则不会。此外,由于itertools 是一个内置模块,除非您有一些明确的限制,否则我看不到导入的太多缺点。
  • 你想到了什么样的k?如果矩阵是十几个或更多,则该矩阵将不适合 RAM。
  • @zaq 好点哈哈

标签: python numpy


【解决方案1】:

我的解决方案:

perm_mat = np.zeros(PERM_SIZE,NUM_OF_PERM))
for i in range(NUM_OF_PERM):
perm_mat[:,i] = np.random.permutation(PERM_SIZE))
perm_mat = perm_mat.astype(int)

【讨论】:

  • 这可能会产生重复排列,而不是产生所有可能的排列。
【解决方案2】:

纯 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]]

还有一些性能技巧的空间,但我懒得写了。

【讨论】:

    【解决方案3】:

    基于this answer:

    import numpy as np
    import itertools as it
    import math
    def myPerms(k):
      f_k=math.factorial(k)
      A=np.empty((k,f_k))
      for i,perm in enumerate(it.permutations(range(k))):
        A[:,i] = perm
      A+=1
      return A
    
    print(myPerms(3))
    #[[ 1.  1.  2.  2.  3.  3.]
    # [ 2.  3.  1.  3.  1.  2.]
    # [ 3.  2.  3.  1.  2.  1.]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 2016-05-22
      • 2014-06-20
      • 1970-01-01
      • 2015-02-04
      • 2016-01-16
      相关资源
      最近更新 更多