gpt4 book ai didi

Python 不是很随机地从对象列表中抽样

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:00:33 25 4
gpt4 key购买 nike

我有大约 20,000 个对象的字典键是对象的字符串表示,值是对象本身。每个对象都有属性 self.lengthself.rateself.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com