从给定Python概率的大列表中选择术语数

时间:2019-01-31 06:23:57

标签: python numpy

我需要从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的方法吗? 还是我做错了什么?

3 个答案:

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

还是其他?