给定元组列表a
:
a =[(23, 11), (10, 16), (13, 11), (12, 3), (4, 15), (10, 16), (10, 16)]
我们可以使用Counter
计算每个元组的出现次数:
>>> from collections import Counter
>>> b = Counter(a)
>>> b
Counter({(4, 15): 1, (10, 16): 3, (12, 3): 1, (13, 11): 1, (23, 11): 1}
现在,我们的想法是从列表中选择3个随机元组,不重复,这样计数就决定了选择特定元组的概率。
例如,(10, 16)
比其他人更有可能被选中 - 它的权重是3/7,而其他四个元组的权重是1/7。
我尝试使用np.random.choice
:
a[np.random.choice(len(a), 3, p=b/len(a))]
但是我无法生成元组。
我在尝试:
a =[(23, 11), (10, 16), (13, 11), (10, 16), (10, 16), (10, 16), (10, 16)]
b = Counter(a)
c = []
print "counter list"
print b
for item in b:
print "item from current list"
print item
print "prob of the item"
print (float(b[item])/float(len(a)))
c.append(float(b[item])/float(len(a)))
print "prob list"
print c
print (np.random.choice(np.arange(len(b)), 3, p=c, replace=False))
在这种情况下,即可得到数组的随机索引。
有没有更优化的方法不必计算 概率数组?
还有一个问题是prob数组与Counter数组不对应。
答案 0 :(得分:0)
如果您对计算频率的中间步骤不感兴趣,可以使用random.shuffle(在列表或副本上),然后根据需要切掉多个项目。
e.g。
import random
a =[(23, 11), (10, 16), (13, 11), (12, 3), (4, 15), (10, 16), (10, 16)]
random.shuffle(a)
random_sample = a[0:3]
print(random_sample)
随着shuffle重新排序,它将避免重复问题,并且统计上应该给出相同的结果(不包括np和随机数之间随机数生成的差异)。
答案 1 :(得分:0)
这样就可以了解
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np
import random
listOfNumbers =[(23, 11), (10, 16), (13, 11), (10, 16), (10, 16), (10, 16), (10, 16)]
b = Counter(listOfNumbers)
c = []
pres=[]
for k,v in b.most_common():
c.append(float(v)/float(len(listOfNumbers)))
pres.append(k)
resultIndex = np.random.choice(np.arange(len(b)), 3, p=c, replace=False)
ass=[]
for res in resultIndex:
ass.append(pres[res])
print ass
现在只是看看有没有办法优化它。
答案 2 :(得分:0)
您可以重复以下步骤3次:
i
范围内随机选择一个[0..n-1]
,其中n
是a
中当前的元素数。tuple
列表中的i
位置找到a
。将tuple
添加到生成的三元组中。tuple
删除所有a
。当a
可以为空时,请注意角落情况。
列表的总时间复杂度为 O(n)。
在第一步中,应根据常规i
提供的统一分布生成数字random
。 a
中特定元组的出现次数越多,选择的次数就越多。