Python 以增量方式创建排列,其中元素均匀地呈现和分布
EDIT:我找到了答案。请参阅最后的解决方案。我很想知道是否有更高效的实施方案(当然有)。 我需要创建包含9个元素的多个数组,每个元素使用数字0-11(包括)。数字需要随机抽样并按随机顺序存储。让我们假设这些数组本身将存储在一个数组中。不管它包含多少个数组(当然,高于某个阈值),这个结果数组都需要满足两个要求:Python 以增量方式创建排列,其中元素均匀地呈现和分布,python,permutation,Python,Permutation,EDIT:我找到了答案。请参阅最后的解决方案。我很想知道是否有更高效的实施方案(当然有)。 我需要创建包含9个元素的多个数组,每个元素使用数字0-11(包括)。数字需要随机抽样并按随机顺序存储。让我们假设这些数组本身将存储在一个数组中。不管它包含多少个数组(当然,高于某个阈值),这个结果数组都需要满足两个要求: 数字0-11需要在所有阵列中均匀采样 每个数字都需要在所有数组中统一索引(例如,beindex[0]的次数与index[1]和index[2]和index[11]大致相同) (1) 和(
index[0]
的次数与index[1]
和index[2]
和index[11]
大致相同)结果数组[0:100]
以及结果数组[200:300]
等等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组合的时间相等。不过,我将研究循环置换。谢谢。这看起来很轻松令人费解的推理。为什么不让这些关系更明确一点呢?