我需要从Python的较大列表中选择多个术语,每个术语都有特定的概率。下面的代码在术语数约为10K时起作用。
import numpy as np
selected_terms = np.random.choice(terms, num_select, replace=False, probability)
我需要从超过20M的条款列表中进行选择(随着时间的推移,条款可能会增加到30M)。 我得到:内存错误 我有一台配备64GB RAM的计算机。当我将术语列表截断为100K时,它将失败。 我不知道np.random.choice在后台如何产生结果,所以我什至不知道它在内存中有多大。
为您提供一些数据背景: 术语:字符串列表[s0,s1,s2,...] num_select:我要选择的术语数(目前大约为400,但可能会略有上升) 概率:术语的每一个元素的发生的概率[P0,P1,P2,...的每一个,p是一个浮体和它们已被标准化为总和为1
我从元组列表开始[[term,count],...] 每学期都有发生的关联计数。我将它们分成并行列表,并通过以下方式生成每个概率:count / sum_all_counts。
还有另一种获取我需要的selected_terms的方法吗? 还是我做错了什么?
答案 0 :(得分:2)
尝试构建具有列 string 和 probability 的数据框 df 。然后将pandas中的函数用作
pd.df['string'].sample(n,weights='probabilities')
其中n是要绘制的字符串数。
希望对您有帮助。
答案 1 :(得分:1)
使用64位python,内存受处理器类型的限制,每个进程32bit python的内存限制为2gig ...然后进一步使其复杂化... numpy需要连续的数组...所以您不能在2G中容纳太多
答案 2 :(得分:0)
我在Pandas中使用了Python3。快。
从上方清理Bhargava的答案:
selected_terms = df['string'].sample(n,weights=df['probabilities'])
我还注意到pandas.sample将为您标准化概率。所以我更改为以下内容:
selected_terms = df['string'].sample(n,weights=df['count'])
df:
string count
------ ------
str1 count_of_each_string
str2 ...
... ...
有人知道pandas.sample如何标准化权重: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sample.html
它只是执行[count1 / sum_counts,count2 / sum_counts,...]之类的操作吗? 还是做诸如Softmax之类的事情? https://en.wikipedia.org/wiki/Softmax_function
还是其他?