Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在数组的每一级创建具有值池条件的排列数组_Python_Numpy_Permutation - Fatal编程技术网

Python在数组的每一级创建具有值池条件的排列数组

Python在数组的每一级创建具有值池条件的排列数组,python,numpy,permutation,Python,Numpy,Permutation,从概念上讲,我试图从10个值(例如[0-9])的池中构建可能的排列数组,其中根据排名,每个元素有3个选项。假设选择的第一个元素是0,那么下一个可能的值池将是1,2,3。如果选择了三个[0,3],那么下一个选项将有一个[1,2,4]的池,依此类推。我想这5个级别,但当然是试图编码一个解决方案,是任意的水平,值和限制条件的数量。 目标是让所有排列在嵌套数组中传回。我将使用这个数组为可视化构建一个数据框架 我的第一次尝试是使用itertools排列为10个值创建所有排列,然后根据与前一个条目的距离,从

从概念上讲,我试图从10个值(例如[0-9])的池中构建可能的排列数组,其中根据排名,每个元素有3个选项。假设选择的第一个元素是0,那么下一个可能的值池将是1,2,3。如果选择了三个[0,3],那么下一个选项将有一个[1,2,4]的池,依此类推。我想这5个级别,但当然是试图编码一个解决方案,是任意的水平,值和限制条件的数量。 目标是让所有排列在嵌套数组中传回。我将使用这个数组为可视化构建一个数据框架

我的第一次尝试是使用
itertools排列
为10个值创建所有排列,然后根据与前一个条目的距离,从中删除那些不符合我的条件的值。这似乎效率低下,但我也很难确定移除的条件


编辑:我没有正确指定选择过程总是以[0,1,2]作为第一选择开始。根据下一个可用级别(最高级别为10),在每个级别添加其他选项。因此,如果在第一级选择2,那么“3”将取代其位置。[0,1,3]是下一个可用选项。如果选择了1,则在下一个级别有[0,3,4]可供选择。这会一直持续到您达到所做选择的最大长度(例如5个)

好吧,如果我理解正确的话,这就是你描述的过程:

Reserve: [3, 4, 5, 6, 7, 8, 9]
Pool: [0, 1, 2]
Chosen: []
只要我们还没有选择5个
项,就从
池中删除任何项
,并将其附加到所选序列中。然后从
Reserve
中删除第一项并将其附加到池中。必要时重复

我将使用p表示池的大小,N表示所选序列的长度。在这个例子中,P=3,N=5

我仍然有点不确定这是否是您打算描述的过程,因为看起来7、8和9永远不会出现在所选的序列中,但您确实说您正在尝试提出一个通用解决方案,因此我假设“保留”实际上是无限大小的

你的问题是,我们如何列举所有可能选择的序列

在此过程中,您要做的唯一选择是从池中提取哪个元素。你总是有P(=3)个选择。这些选择总是不同的项目(因为每个项目只有一个)。只要你确信没有两个不同的选择序列会导致相同的项目序列,你现在就可以看到你有了完全可能的序列。剩下的唯一棘手的事情是将一系列选择索引转换为一系列选择值。我建议只执行上面描述的算法,而不是做任何聪明的事情

来自itertools导入的
(产品、计数)
def生成_序列(池大小,n):
对于产品中的选择顺序(范围(池大小),重复=n):
池=列表(范围(池大小))
序列=[]
保留=计数(池大小)
对于choice_序列中的choice_索引:
sequence.append(池[choice\u index])
池[选项索引]=下一个(保留)
产量序列
我认为这是可行的。为了简化问题,而不是从池中间删除选定的项目,并在池的末尾从保留区追加新项目,我将新项目放入选定项目腾出的插槽中。这改变了我们发出序列的顺序,但我认为它不应该改变生成的整个序列集

也许有一种更简单的方法可以做到这一点,但我认为就时间复杂性而言,这是最好的方法



这里未解决的问题是基本项集(我们称其大小为R)是否会受到限制。显然,情况一定是这样的,R≥ N或您根本无法选择N个项目。然而,如果R我很难理解您的选择通常是如何工作的。如果首先选择
8
,下一个池是什么?在选择第二个数字后,池会发生怎样的变化?你能澄清一下吗?排列的第一个选定元素可以是0到9中的任意一个,还是只能从[0,1,2]的初始池中提取?一个完整的排列是否具有全部10个值,或者每个排列是否具有可变长度?不清楚如何将您的示例扩展到您想要的行为的完整规范。我补充了一些说明。让我知道需要更多。