Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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_Permutation - Fatal编程技术网

Python 以增量方式创建排列,其中元素均匀地呈现和分布

Python 以增量方式创建排列,其中元素均匀地呈现和分布,python,permutation,Python,Permutation,EDIT:我找到了答案。请参阅最后的解决方案。我很想知道是否有更高效的实施方案(当然有)。 我需要创建包含9个元素的多个数组,每个元素使用数字0-11(包括)。数字需要随机抽样并按随机顺序存储。让我们假设这些数组本身将存储在一个数组中。不管它包含多少个数组(当然,高于某个阈值),这个结果数组都需要满足两个要求: 数字0-11需要在所有阵列中均匀采样 每个数字都需要在所有数组中统一索引(例如,beindex[0]的次数与index[1]和index[2]和index[11]大致相同) (1) 和(

EDIT:我找到了答案。请参阅最后的解决方案。我很想知道是否有更高效的实施方案(当然有)。

我需要创建包含9个元素的多个数组,每个元素使用数字0-11(包括)。数字需要随机抽样并按随机顺序存储。让我们假设这些数组本身将存储在一个数组中。不管它包含多少个数组(当然,高于某个阈值),这个结果数组都需要满足两个要求:

  • 数字0-11需要在所有阵列中均匀采样
  • 每个数字都需要在所有数组中统一索引(例如,be
    index[0]
    的次数与
    index[1]
    index[2]
    index[11]
    大致相同)
  • (1) 和(2)需要对结果数组的任何部分保持true。即,
    结果数组[0:100]
    以及
    结果数组[200:300]
    等等
  • 到目前为止,我已经尝试过使用itertools和shuffle。这种方法会对所有数字产生或多或少的偶数,即使我对结果数组的一小部分进行切片(不过在这方面可能会更好).然而,这并不能使数字均匀分布在数组索引上。而且,这会产生比我需要的更多的排列;我估计有500个排列我应该可以

    import random
    import numpy as np
    from collections import defaultdict as d
    
    # create 10 random arrays to get things going
    def shuffleThings(num, arr):
        results = []
        for i in range(num):
            b = arr.copy()
            random.shuffle(b)
            a = b[0:arrSize]
            results.append(a)
        return results
    
    def updateDict(fDict, dDict, arr):
        for i in range(len(arr)):       
            fDict[arr[i]] += 1
            dDict[arr[i]][i] += 1    
            
    def pickNums(arr):
        selected = []
        #random.shuffle(arr)
        for i in range(arrSize):
            selected.append(arr[i][0])
        random.shuffle(selected)
        return selected
    
    def sortArrays(list1, list2): 
        zipped_pairs = zip(list2, list1) 
        z = [x for _, x in sorted(zipped_pairs)]     
        return z
        
    
    startArrays = 10
    totalArrays = 80
    nums = [0,1,2,3,4,5,6,7,8,9,10,11]
    arrSize = 9
    freqDict = d(list)
    distDict = d(list)
    
    for i in nums:
        freqDict[i] = 0
        distDict[i] = [0,0,0,0,0,0,0,0,0]
        
    all_arrays = shuffleThings(10, nums)
    for i in all_arrays:
        updateDict(freqDict, distDict,i)
    
    for i in range(totalArrays - startArrays):
        f = sorted(freqDict.items(), key=lambda item: item[1])
        tempNums = pickNums(f)
        newNums = ["","","","","","","","",""]
        counter = 0
        for j in tempNums:
            dists = distDict[j]
            indices = sortArrays([0,1,2,3,4,5,6,7,8,9],dists)
            for k in indices:
                if (newNums[k]==""):
                    newNums[k] = j
                    break
            counter += 1
        updateDict(freqDict,distDict,newNums)
        all_arrays.append(newNums)
        
    res = []
    for i in range(len(all_arrays)):
        res.append(str(all_arrays[i])[1:-1])
    
    print(*res, sep='\n')
    >>>
    ##excerpt
    1, 3, 0, 8, 5, 7, 9, 11, 10
    6, 2, 0, 1, 8, 7, 11, 5, 10
    2, 5, 10, 0, 1, 9, 7, 8, 3
    4, 9, 3, 7, 1, 5, 8, 11, 2
    10, 0, 5, 8, 4, 9, 1, 2, 7
    5, 2, 9, 8, 7, 0, 10, 4, 11
    2, 0, 7, 10, 5, 4, 1, 3, 8
    2, 9, 4, 0, 1, 3, 10, 6, 8
    3, 0, 1, 9, 4, 10, 5, 11, 2
    1, 5, 2, 7, 0, 8, 10, 11, 9
    11, 4, 6, 3, 2, 1, 7, 9, 0
    
    print(freqDict)
    >>> {0: 60, 1: 60, 2: 60, 3: 60, 4: 60, 5: 60, 6: 60, 7: 60, 8: 60, 9: 60, 10: 60, 11: 60}
    
    print(distDict)
    >>> {0: [7, 7, 7, 7, 6, 6, 6, 7, 7], 
    1: [7, 7, 6, 7, 7, 6, 8, 6, 6], 
    2: [6, 6, 7, 7, 7, 7, 7, 7, 6], 
    3: [7, 7, 6, 6, 6, 7, 7, 7, 7], 
    4: [7, 7, 7, 7, 7, 6, 6, 6, 7], 
    5: [6, 7, 7, 6, 7, 7, 7, 7, 6], 
    6: [6, 6, 7, 7, 7, 6, 6, 7, 8], 
    7: [7, 7, 7, 7, 6, 7, 7, 6, 6], 
    8: [6, 7, 7, 6, 6, 7, 7, 7, 7], 
    9: [7, 6, 6, 6, 7, 7, 6, 8, 7], 
    10: [7, 7, 7, 7, 7, 7, 6, 6, 6], 
    11: [7, 6, 6, 7, 7, 7, 7, 6, 7]}
    

    如果您从均匀分布中采样,并且没有跨列/行的唯一性要求,那么您应该随机选取数字并使其符合您需要的形状。这应该足够了。另一方面,如果您需要跨行/列的唯一性,那么您可以研究循环置换而不是完全置换。因为关于我在Qualtrics中所做的工作,我需要确保数字均匀分布在各个指数上,这是随机抽样无法保证的。对于数组[8,0,9,3,7,11,5,10,2],每个数字控制我刺激的一个变量(X),数组中数字的位置控制第二个变量(Y).索引0-2上的数字确定X与Y的组合,这样这个数组将产生Y0_X8、Y0_X0、Y0_X9。索引3-5将产生Y1_X3、Y1_X7、Y1_X11。索引6-8将产生Y2_X5、Y2_X10、Y2_X2。我需要选择所有Y和X组合的时间相等。不过,我将研究循环置换。谢谢。这看起来很轻松令人费解的推理。为什么不让这些关系更明确一点呢?