考虑这样一个问题,给定一个矩阵(多维数组,numpy.ndarray()),如何shuffle这个矩阵(也就是对其行进行全排列),如何随机地选择其中的k行,这叫组合,实现一种某一维度空间的切片。例如五列中选三列(全部三列的排列数),便从原有的五维空间中降维到三维空间,因为是全部的排列数,故不会漏掉任何一种可能性。
涉及的函数主要有:
np.random.permutation()
itertools.combinations()
itertools.permutations()
# 1. 对0-5之间的数进行一次全排列>>>np.random.permutation(6)array([3,1,5,4,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])>>>parray([1,0])>>>A[p,:] array([[ 5,[ 9,12],[ 1,4]])
C52的实现
>>>from itertools import combinations>>>combins = [c for c in combinations(range(5),2)]>>>len(combins)10>>>combins # 而且是按序排列[(0,1),(0,2),3),4),(1,(2,(3,4)]
A52的实现
>>>from itertools import permutations>>>pertumations(range(5),2)<itertools.permutations object at 0x0233E360>>>>perms = permutations(range(5),2)>>>perms[(0,0),(4,3)]>>>len(perms)20
# 5. 任取其中的k(k=2)行>>>c = [c for c in combinations(range(A.shape[0]),2)]>>>A[c[0],:] # 一种排列array([[1,8]])
下面再介绍一个列表数据任意组合,主要是利用自带的库
#_*_ Coding:utf-8 _*_#__author__='dragon'import itertoolsList1 = [1,5]List2 = []for i in range(1,len(List1)+1): iter = itertools.combinations(List1,i) List2.append(List(iter))print(List2)
[[(1,),(5,)],[(1,5),5)],5)]]
排列的实现
#_*_ Coding:utf-8 _*_#__author__='dragon'import itertoolsList1 = [1,len(List1)+1): iter = itertools.permutations(List1,i) List2.append(List(iter))print(List2)
运行结果:
[[(1,4)],3)],2)],1)]]
可以根据你需要随意组合
python实现排列组合公式C(m,n)求值
# -*- 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
运行结果:
n:5 value:120n:3 value:6n:2 value:2value: 10
总结
以上就是本文关于Python排列组合算法的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python数据结构与算法之列表(链表,linked list)简单实现、Python算法之求n个节点不同二叉树个数等,有什么问题可以随时留言,小编会及时回复大家的。
总结以上是内存溢出为你收集整理的Python编程之黑板上排列组合,你舍得解开吗全部内容,希望文章能够帮你解决Python编程之黑板上排列组合,你舍得解开吗所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)