【问题标题】:Permutations of columns in a matrix矩阵中列的排列
【发布时间】:2014-02-20 23:08:22
【问题描述】:

我有一个简单的问题!我有一个矩阵,它有 8 列和大约 20 行。矩阵的每个索引都填充了一些字母。我想知道是否有一种有效的方法来产生矩阵的排列(列)?我正在研究列转置密码,我想从本质上测试每一列排列(交换整个列),以便我可以解决密码。

有没有一种有效的方法可以在 python 中使用 itertools 或我不知道的任何其他技术?非常感谢您的帮助!

我首先这样做初始化数组:

LMATRIX = [['' for x in xrange(8)] for x in xrange(53)] 

然后用字母填充它......

例如 置换前:

0 1 2 3 4 5 6 7
B C R H L M N O
J F K A B C D R

排列的一次迭代后:

**1 0** 2 3 4 5 6 7 
**C B** R H L M N O
**F J** K A B C D R

再次感谢!

【问题讨论】:

  • 取决于您使用什么数据结构来表示矩阵,使用 itertools.permutations 似乎是要走的路
  • 是的,但是如何在不使用 for 循环的情况下使用新创建的列排列交换列? >_>有没有更高效的方法?

标签: python algorithm matrix iteration


【解决方案1】:

这个解决方案我玩的不多,但它似乎适用于简单的情况。出于可读性目的,矩阵较小。这个想法是itertools.permutations 将为每一行生成相同的排列,然后您需要将它们一起zip 以重建每个排列矩阵。您需要将下面的代码概括为更大的矩阵。所有人都仔细阅读itertools.permutations,以确保所有潜在输入的排列都是“相同的”

In [1]: import string                                                                        

In [2]: import random                                                                        

In [3]: LMATRIX = [[random.choice(string.ascii_uppercase) for y in xrange(3)] for x in xrange(2)]

In [4]: def print_mat(m):
   ...:     for row in m:
   ...:         print row
   ...:         

原来的矩阵是:

In [5]: print_mat(LMATRIX)
['V', 'E', 'E']
['G', 'X', 'T']


In [6]: from itertools import permutations

In [7]: for perm in zip(permutations(LMATRIX[0]), permutations(LMATRIX[1])):
   ...:     print_mat(perm)
   ...:     print "\n"
   ...:     
('V', 'E', 'E')
('G', 'X', 'T')

('V', 'E', 'E')
('G', 'T', 'X')

('E', 'V', 'E')
('X', 'G', 'T')

('E', 'E', 'V')
('X', 'T', 'G')

('E', 'V', 'E')
('T', 'G', 'X')

('E', 'E', 'V')
('T', 'X', 'G')

【讨论】:

  • 这太完美了!现在我将如何为 8 x 52 矩阵执行此操作? (8 列 52 行)哈哈...
  • 我认为您可能需要itertools.izip 来处理更大的矩阵。此外,查看numpy 进行矩阵运算可能是个好主意
  • 啊,好吧,我会试着弄清楚。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
相关资源
最近更新 更多