从列表中生成随机加权元组列表

时间:2016-01-21 21:18:06

标签: python numpy tuples probability

给定元组列表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数组不对应。

3 个答案:

答案 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次:

  1. i范围内随机选择一个[0..n-1],其中na中当前的元素数。
  2. 在初始tuple列表中的i位置找到a。将tuple添加到生成的三元组中。
  3. tuple删除所有a
  4. a可以为空时,请注意角落情况。

    列表的总时间复杂度为 O(n)

    在第一步中,应根据常规i提供的统一分布生成数字randoma中特定元组的出现次数越多,选择的次数就越多。