考虑这样一个问题,给定一个矩阵(多维数组,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]) >>>p array([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 itertools list1 = [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 itertools list1 = [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:120 n:3 value:6 n:2 value:2 value: 10
总结
以上就是本文关于Python排列组合算法的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python数据结构与算法之列表(链表,linked list)简单实现、Python算法之求n个节点不同二叉树个数等,有什么问题可以随时留言,小编会及时回复大家的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。