考慮這樣一個問題,給定一個矩陣(多維數組,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