考虑这样一个问题,给定一个矩阵(多维数组,numpy.ndarray()),如何shuffle这个矩阵(也就是对其行进行全排列),如何随机地选择其中的k行,这叫组合,实现一种某一维度空间的切片。例如五列中选三列(全部三列的排列数),便从原有的五维空间中降维到三维空间,因为是全部的排列数,故不会漏掉任何一种可能性。
涉及的函数主要有:
np.random.permutation()
itertools.combinations()
itertools.permutations()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 1. 对0-5之间的数进行一次全排列 >>>np.random.permutation( 6 ) array([ 3 , 1 , 5 , 4 , 0 , 2 ]) # 2. 创建待排矩阵 >>>A = np.array([[ 1 , 2 , 3 , 4 ], [ 5 , 6 , 7 , 8 ], [ 9 , 10 , 11 , 12 ]]) # 3. shuffle矩阵A >>>p = np.random.permutation(A.shape[ 0 ]) >>>p array([ 1 , 2 , 0 ]) >>>A[p, :] array([[ 5 , 6 , 7 , 8 ], [ 9 , 10 , 11 , 12 ], [ 1 , 2 , 3 , 4 ]]) |
C52的实现
1
2
3
4
5
6
|
>>> from itertools import combinations >>>combins = [c for c in combinations( range ( 5 ), 2 )] >>> len (combins) 10 >>>combins # 而且是按序排列 [( 0 , 1 ), ( 0 , 2 ), ( 0 , 3 ), ( 0 , 4 ), ( 1 , 2 ), ( 1 , 3 ), ( 1 , 4 ), ( 2 , 3 ), ( 2 , 4 ), ( 3 , 4 )] |
A52的实现
1
2
3
4
5
6
7
8
9
10
|
>>> from itertools import permutations >>>pertumations( range ( 5 ), 2 ) <itertools.permutations object at 0x0233E360 > >>>perms = permutations( range ( 5 ), 2 ) >>>perms [( 0 , 1 ), ( 0 , 2 ), ( 0 , 3 ), ( 0 , 4 ), ( 1 , 0 ), ( 1 , 2 ), ( 1 , 3 ), ( 1 , 4 ), ( 2 , 0 ), ( 2 , 1 ), ( 2 , 3 ), ( 2 , 4 ), ( 3 , 0 ), ( 3 , 1 ), ( 3 , 2 ), ( 3 , 4 ), ( 4 , 0 ), ( 4 , 1 ), ( 4 , 2 ), ( 4 , 3 )] >>> len (perms) 20 |
1
2
3
4
5
|
# 5. 任取其中的k(k=2)行 >>>c = [c for c in combinations( range (A.shape[ 0 ]), 2 )] >>>A[c[ 0 ], :] # 一种排列 array([[ 1 , 2 , 3 , 4 ], [ 5 , 6 , 7 , 8 ]]) |
下面再介绍一个列表数据任意组合,主要是利用自带的库
1
2
3
4
5
6
7
8
9
|
#_*_ coding:utf-8 _*_ #__author__='dragon' import itertools list1 = [ 1 , 2 , 3 , 4 , 5 ] list2 = [] for i in range ( 1 , len (list1) + 1 ): iter = itertools.combinations(list1,i) list2.append( list ( iter )) print (list2) |
1
|
[[( 1 ,), ( 2 ,), ( 3 ,), ( 4 ,), ( 5 ,)], [( 1 , 2 ), ( 1 , 3 ), ( 1 , 4 ), ( 1 , 5 ), ( 2 , 3 ), ( 2 , 4 ), ( 2 , 5 ), ( 3 , 4 ), ( 3 , 5 ), ( 4 , 5 )], [( 1 , 2 , 3 ), ( 1 , 2 , 4 ), ( 1 , 2 , 5 ), ( 1 , 3 , 4 ), ( 1 , 3 , 5 ), ( 1 , 4 , 5 ), ( 2 , 3 , 4 ), ( 2 , 3 , 5 ), ( 2 , 4 , 5 ), ( 3 , 4 , 5 )], [( 1 , 2 , 3 , 4 ), ( 1 , 2 , 3 , 5 ), ( 1 , 2 , 4 , 5 ), ( 1 , 3 , 4 , 5 ), ( 2 , 3 , 4 , 5 )], [( 1 , 2 , 3 , 4 , 5 )]] |
排列的实现
1
2
3
4
5
6
7
8
9
|
#_*_ coding:utf-8 _*_ #__author__='dragon' import itertools list1 = [ 1 , 2 , 3 , 4 , 5 ] list2 = [] for i in range ( 1 , len (list1) + 1 ): iter = itertools.permutations(list1,i) list2.append( list ( iter )) print (list2) |
运行结果:
1
|
[[( 1 ,), ( 2 ,), ( 3 ,), ( 4 ,), ( 5 ,)], [( 1 , 2 ), ( 1 , 3 ), ( 1 , 4 ), ( 1 , 5 ), ( 2 , 1 ), ( 2 , 3 ), ( 2 , 4 ), ( 2 , 5 ), ( 3 , 1 ), ( 3 , 2 ), ( 3 , 4 ), ( 3 , 5 ), ( 4 , 1 ), ( 4 , 2 ), ( 4 , 3 ), ( 4 , 5 ), ( 5 , 1 ), ( 5 , 2 ), ( 5 , 3 ), ( 5 , 4 )], [( 1 , 2 , 3 ), ( 1 , 2 , 4 ), ( 1 , 2 , 5 ), ( 1 , 3 , 2 ), ( 1 , 3 , 4 ), ( 1 , 3 , 5 ), ( 1 , 4 , 2 ), ( 1 , 4 , 3 ), ( 1 , 4 , 5 ), ( 1 , 5 , 2 ), ( 1 , 5 , 3 ), ( 1 , 5 , 4 ), ( 2 , 1 , 3 ), ( 2 , 1 , 4 ), ( 2 , 1 , 5 ), ( 2 , 3 , 1 ), ( 2 , 3 , 4 ), ( 2 , 3 , 5 ), ( 2 , 4 , 1 ), ( 2 , 4 , 3 ), ( 2 , 4 , 5 ), ( 2 , 5 , 1 ), ( 2 , 5 , 3 ), ( 2 , 5 , 4 ), ( 3 , 1 , 2 ), ( 3 , 1 , 4 ), ( 3 , 1 , 5 ), ( 3 , 2 , 1 ), ( 3 , 2 , 4 ), ( 3 , 2 , 5 ), ( 3 , 4 , 1 ), ( 3 , 4 , 2 ), ( 3 , 4 , 5 ), ( 3 , 5 , 1 ), ( 3 , 5 , 2 ), ( 3 , 5 , 4 ), ( 4 , 1 , 2 ), ( 4 , 1 , 3 ), ( 4 , 1 , 5 ), ( 4 , 2 , 1 ), ( 4 , 2 , 3 ), ( 4 , 2 , 5 ), ( 4 , 3 , 1 ), ( 4 , 3 , 2 ), ( 4 , 3 , 5 ), ( 4 , 5 , 1 ), ( 4 , 5 , 2 ), ( 4 , 5 , 3 ), ( 5 , 1 , 2 ), ( 5 , 1 , 3 ), ( 5 , 1 , 4 ), ( 5 , 2 , 1 ), ( 5 , 2 , 3 ), ( 5 , 2 , 4 ), ( 5 , 3 , 1 ), ( 5 , 3 , 2 ), ( 5 , 3 , 4 ), ( 5 , 4 , 1 ), ( 5 , 4 , 2 ), ( 5 , 4 , 3 )], [( 1 , 2 , 3 , 4 ), ( 1 , 2 , 3 , 5 ), ( 1 , 2 , 4 , 3 ), ( 1 , 2 , 4 , 5 ), ( 1 , 2 , 5 , 3 ), ( 1 , 2 , 5 , 4 ), ( 1 , 3 , 2 , 4 ), ( 1 , 3 , 2 , 5 ), ( 1 , 3 , 4 , 2 ), ( 1 , 3 , 4 , 5 ), ( 1 , 3 , 5 , 2 ), ( 1 , 3 , 5 , 4 ), ( 1 , 4 , 2 , 3 ), ( 1 , 4 , 2 , 5 ), ( 1 , 4 , 3 , 2 ), ( 1 , 4 , 3 , 5 ), ( 1 , 4 , 5 , 2 ), ( 1 , 4 , 5 , 3 ), ( 1 , 5 , 2 , 3 ), ( 1 , 5 , 2 , 4 ), ( 1 , 5 , 3 , 2 ), ( 1 , 5 , 3 , 4 ), ( 1 , 5 , 4 , 2 ), ( 1 , 5 , 4 , 3 ), ( 2 , 1 , 3 , 4 ), ( 2 , 1 , 3 , 5 ), ( 2 , 1 , 4 , 3 ), ( 2 , 1 , 4 , 5 ), ( 2 , 1 , 5 , 3 ), ( 2 , 1 , 5 , 4 ), ( 2 , 3 , 1 , 4 ), ( 2 , 3 , 1 , 5 ), ( 2 , 3 , 4 , 1 ), ( 2 , 3 , 4 , 5 ), ( 2 , 3 , 5 , 1 ), ( 2 , 3 , 5 , 4 ), ( 2 , 4 , 1 , 3 ), ( 2 , 4 , 1 , 5 ), ( 2 , 4 , 3 , 1 ), ( 2 , 4 , 3 , 5 ), ( 2 , 4 , 5 , 1 ), ( 2 , 4 , 5 , 3 ), ( 2 , 5 , 1 , 3 ), ( 2 , 5 , 1 , 4 ), ( 2 , 5 , 3 , 1 ), ( 2 , 5 , 3 , 4 ), ( 2 , 5 , 4 , 1 ), ( 2 , 5 , 4 , 3 ), ( 3 , 1 , 2 , 4 ), ( 3 , 1 , 2 , 5 ), ( 3 , 1 , 4 , 2 ), ( 3 , 1 , 4 , 5 ), ( 3 , 1 , 5 , 2 ), ( 3 , 1 , 5 , 4 ), ( 3 , 2 , 1 , 4 ), ( 3 , 2 , 1 , 5 ), ( 3 , 2 , 4 , 1 ), ( 3 , 2 , 4 , 5 ), ( 3 , 2 , 5 , 1 ), ( 3 , 2 , 5 , 4 ), ( 3 , 4 , 1 , 2 ), ( 3 , 4 , 1 , 5 ), ( 3 , 4 , 2 , 1 ), ( 3 , 4 , 2 , 5 ), ( 3 , 4 , 5 , 1 ), ( 3 , 4 , 5 , 2 ), ( 3 , 5 , 1 , 2 ), ( 3 , 5 , 1 , 4 ), ( 3 , 5 , 2 , 1 ), ( 3 , 5 , 2 , 4 ), ( 3 , 5 , 4 , 1 ), ( 3 , 5 , 4 , 2 ), ( 4 , 1 , 2 , 3 ), ( 4 , 1 , 2 , 5 ), ( 4 , 1 , 3 , 2 ), ( 4 , 1 , 3 , 5 ), ( 4 , 1 , 5 , 2 ), ( 4 , 1 , 5 , 3 ), ( 4 , 2 , 1 , 3 ), ( 4 , 2 , 1 , 5 ), ( 4 , 2 , 3 , 1 ), ( 4 , 2 , 3 , 5 ), ( 4 , 2 , 5 , 1 ), ( 4 , 2 , 5 , 3 ), ( 4 , 3 , 1 , 2 ), ( 4 , 3 , 1 , 5 ), ( 4 , 3 , 2 , 1 ), ( 4 , 3 , 2 , 5 ), ( 4 , 3 , 5 , 1 ), ( 4 , 3 , 5 , 2 ), ( 4 , 5 , 1 , 2 ), ( 4 , 5 , 1 , 3 ), ( 4 , 5 , 2 , 1 ), ( 4 , 5 , 2 , 3 ), ( 4 , 5 , 3 , 1 ), ( 4 , 5 , 3 , 2 ), ( 5 , 1 , 2 , 3 ), ( 5 , 1 , 2 , 4 ), ( 5 , 1 , 3 , 2 ), ( 5 , 1 , 3 , 4 ), ( 5 , 1 , 4 , 2 ), ( 5 , 1 , 4 , 3 ), ( 5 , 2 , 1 , 3 ), ( 5 , 2 , 1 , 4 ), ( 5 , 2 , 3 , 1 ), ( 5 , 2 , 3 , 4 ), ( 5 , 2 , 4 , 1 ), ( 5 , 2 , 4 , 3 ), ( 5 , 3 , 1 , 2 ), ( 5 , 3 , 1 , 4 ), ( 5 , 3 , 2 , 1 ), ( 5 , 3 , 2 , 4 ), ( 5 , 3 , 4 , 1 ), ( 5 , 3 , 4 , 2 ), ( 5 , 4 , 1 , 2 ), ( 5 , 4 , 1 , 3 ), ( 5 , 4 , 2 , 1 ), ( 5 , 4 , 2 , 3 ), ( 5 , 4 , 3 , 1 ), ( 5 , 4 , 3 , 2 )], [( 1 , 2 , 3 , 4 , 5 ), ( 1 , 2 , 3 , 5 , 4 ), ( 1 , 2 , 4 , 3 , 5 ), ( 1 , 2 , 4 , 5 , 3 ), ( 1 , 2 , 5 , 3 , 4 ), ( 1 , 2 , 5 , 4 , 3 ), ( 1 , 3 , 2 , 4 , 5 ), ( 1 , 3 , 2 , 5 , 4 ), ( 1 , 3 , 4 , 2 , 5 ), ( 1 , 3 , 4 , 5 , 2 ), ( 1 , 3 , 5 , 2 , 4 ), ( 1 , 3 , 5 , 4 , 2 ), ( 1 , 4 , 2 , 3 , 5 ), ( 1 , 4 , 2 , 5 , 3 ), ( 1 , 4 , 3 , 2 , 5 ), ( 1 , 4 , 3 , 5 , 2 ), ( 1 , 4 , 5 , 2 , 3 ), ( 1 , 4 , 5 , 3 , 2 ), ( 1 , 5 , 2 , 3 , 4 ), ( 1 , 5 , 2 , 4 , 3 ), ( 1 , 5 , 3 , 2 , 4 ), ( 1 , 5 , 3 , 4 , 2 ), ( 1 , 5 , 4 , 2 , 3 ), ( 1 , 5 , 4 , 3 , 2 ), ( 2 , 1 , 3 , 4 , 5 ), ( 2 , 1 , 3 , 5 , 4 ), ( 2 , 1 , 4 , 3 , 5 ), ( 2 , 1 , 4 , 5 , 3 ), ( 2 , 1 , 5 , 3 , 4 ), ( 2 , 1 , 5 , 4 , 3 ), ( 2 , 3 , 1 , 4 , 5 ), ( 2 , 3 , 1 , 5 , 4 ), ( 2 , 3 , 4 , 1 , 5 ), ( 2 , 3 , 4 , 5 , 1 ), ( 2 , 3 , 5 , 1 , 4 ), ( 2 , 3 , 5 , 4 , 1 ), ( 2 , 4 , 1 , 3 , 5 ), ( 2 , 4 , 1 , 5 , 3 ), ( 2 , 4 , 3 , 1 , 5 ), ( 2 , 4 , 3 , 5 , 1 ), ( 2 , 4 , 5 , 1 , 3 ), ( 2 , 4 , 5 , 3 , 1 ), ( 2 , 5 , 1 , 3 , 4 ), ( 2 , 5 , 1 , 4 , 3 ), ( 2 , 5 , 3 , 1 , 4 ), ( 2 , 5 , 3 , 4 , 1 ), ( 2 , 5 , 4 , 1 , 3 ), ( 2 , 5 , 4 , 3 , 1 ), ( 3 , 1 , 2 , 4 , 5 ), ( 3 , 1 , 2 , 5 , 4 ), ( 3 , 1 , 4 , 2 , 5 ), ( 3 , 1 , 4 , 5 , 2 ), ( 3 , 1 , 5 , 2 , 4 ), ( 3 , 1 , 5 , 4 , 2 ), ( 3 , 2 , 1 , 4 , 5 ), ( 3 , 2 , 1 , 5 , 4 ), ( 3 , 2 , 4 , 1 , 5 ), ( 3 , 2 , 4 , 5 , 1 ), ( 3 , 2 , 5 , 1 , 4 ), ( 3 , 2 , 5 , 4 , 1 ), ( 3 , 4 , 1 , 2 , 5 ), ( 3 , 4 , 1 , 5 , 2 ), ( 3 , 4 , 2 , 1 , 5 ), ( 3 , 4 , 2 , 5 , 1 ), ( 3 , 4 , 5 , 1 , 2 ), ( 3 , 4 , 5 , 2 , 1 ), ( 3 , 5 , 1 , 2 , 4 ), ( 3 , 5 , 1 , 4 , 2 ), ( 3 , 5 , 2 , 1 , 4 ), ( 3 , 5 , 2 , 4 , 1 ), ( 3 , 5 , 4 , 1 , 2 ), ( 3 , 5 , 4 , 2 , 1 ), ( 4 , 1 , 2 , 3 , 5 ), ( 4 , 1 , 2 , 5 , 3 ), ( 4 , 1 , 3 , 2 , 5 ), ( 4 , 1 , 3 , 5 , 2 ), ( 4 , 1 , 5 , 2 , 3 ), ( 4 , 1 , 5 , 3 , 2 ), ( 4 , 2 , 1 , 3 , 5 ), ( 4 , 2 , 1 , 5 , 3 ), ( 4 , 2 , 3 , 1 , 5 ), ( 4 , 2 , 3 , 5 , 1 ), ( 4 , 2 , 5 , 1 , 3 ), ( 4 , 2 , 5 , 3 , 1 ), ( 4 , 3 , 1 , 2 , 5 ), ( 4 , 3 , 1 , 5 , 2 ), ( 4 , 3 , 2 , 1 , 5 ), ( 4 , 3 , 2 , 5 , 1 ), ( 4 , 3 , 5 , 1 , 2 ), ( 4 , 3 , 5 , 2 , 1 ), ( 4 , 5 , 1 , 2 , 3 ), ( 4 , 5 , 1 , 3 , 2 ), ( 4 , 5 , 2 , 1 , 3 ), ( 4 , 5 , 2 , 3 , 1 ), ( 4 , 5 , 3 , 1 , 2 ), ( 4 , 5 , 3 , 2 , 1 ), ( 5 , 1 , 2 , 3 , 4 ), ( 5 , 1 , 2 , 4 , 3 ), ( 5 , 1 , 3 , 2 , 4 ), ( 5 , 1 , 3 , 4 , 2 ), ( 5 , 1 , 4 , 2 , 3 ), ( 5 , 1 , 4 , 3 , 2 ), ( 5 , 2 , 1 , 3 , 4 ), ( 5 , 2 , 1 , 4 , 3 ), ( 5 , 2 , 3 , 1 , 4 ), ( 5 , 2 , 3 , 4 , 1 ), ( 5 , 2 , 4 , 1 , 3 ), ( 5 , 2 , 4 , 3 , 1 ), ( 5 , 3 , 1 , 2 , 4 ), ( 5 , 3 , 1 , 4 , 2 ), ( 5 , 3 , 2 , 1 , 4 ), ( 5 , 3 , 2 , 4 , 1 ), ( 5 , 3 , 4 , 1 , 2 ), ( 5 , 3 , 4 , 2 , 1 ), ( 5 , 4 , 1 , 2 , 3 ), ( 5 , 4 , 1 , 3 , 2 ), ( 5 , 4 , 2 , 1 , 3 ), ( 5 , 4 , 2 , 3 , 1 ), ( 5 , 4 , 3 , 1 , 2 ), ( 5 , 4 , 3 , 2 , 1 )]] |
可以根据你需要随意组合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# -*- coding:utf-8 -*- # 用python实现排列组合C(n,m) = n!/m!*(n-m)! def get_value(n): if n = = 1 : return n else : return n * get_value(n - 1 ) def gen_last_value(n,m): first = get_value(n) print "n:%s value:%s" % (n, first) second = get_value(m) print "n:%s value:%s" % (m, second) third = get_value((n - m)) print "n:%s value:%s" % ((n - m), third) return first / (second * third) if __name__ = = "__main__" : # C(12,5) rest = gen_last_value( 5 , 3 ) print "value:" , rest |
运行结果:
1
2
3
4
|
n: 5 value: 120 n: 3 value: 6 n: 2 value: 2 value: 10 |
总结
以上就是本文关于Python排列组合算法的全部内容,希望对大家有所帮助。有什么问题可以随时留言,小编会及时回复大家的。
原文链接:http://blog.csdn.net/lanchunhui/article/details/49494265