- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有大约 20,000 个对象的字典键是对象的字符串表示,值是对象本身。每个对象都有属性 self.length
和 self.rate
。 self.rate
计算为 1.5E-8*self.length
。
我需要根据他们的比率从这个字典中选择一个预先确定的数量(在这个例子中我们会说 500)的项目,并进行替换。比率较低的对象将不太可能被选中,而比率较高的对象则更有可能被选中。
我认为我可以做到这一点的方式非常慢。
在 while 循环中,当所选对象的数量少于所需选择的数量时,我生成一个介于 0 和字典长度之间的随机数,然后选择该元素。然后我生成另一个随机数,如果该随机数小于列表中所选对象的 rate
,则会将其添加到所选对象中。起初这似乎很好,但现在我意识到它太慢了。有人对如何更快地执行此操作有建议吗?
一些代码:对象的类定义
from numpy import random
class object():
def __init__(self, length):
self.length = length
self.rate = (1.15E-8*self.length)
def select(self):
x = random.uniform(0,1)
if(x<self.rate):
return True
else:
return False
以及完成其余工作的函数(在另一个模块中):
def select_random(object_dict,maxselect):
nselect = 0
object_names = object_dict.keys()
selected_objects = []
while(nselect < maxselect):
x = random.randint(0,len(object_dict))
if(object_dict[object_names[x]].select()):
nselect +=1
selected_objects.append(object_names[x])
return(selected_objects)
我认为真正让它变慢的原因是每个对象被选中的概率太小,甚至在选择一个对象之前都需要多次迭代,更不用说 500 次或更多次了。
长度分布:
Min. 1st Qu. Median Mean 3rd Qu. Max.
51 822 1311 1770 2112 103000
最佳答案
试试这个:
import numpy as np # requires NumPy 1.7 (!)
def select_random(object_dict, n):
keys = object_dict.keys()
rate = np.array([x.rate for x in keys])
prob = rate / rate.sum()
return np.random.choice(keys, size=n, replace=True, p=prob)
( Documentation )
P.S.,调用类 object
是个坏主意,因为它也是内置通用基类的名称。
关于Python 不是很随机地从对象列表中抽样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11757938/
我想从列表中抽取项目样本,但我想设置每个项目被包含的概率,而不是要抽取的项目总数(所以 random.sample( ) 不起作用)。我用下面的代码得到了我想要的效果(其中 p 是包含的概率,item
我正在使用 Google Analytics Reporting API,但即使指定日期范围内的 session 远少于 500K limit,我也会得到抽样结果。 .我一个月只有约 4K 次 ses
我是一名优秀的程序员,十分优秀!