7

所以,我有单词列表,我需要知道每个单词在每个列表中出现的频率。使用“.count(word)”可以,但是太慢了(每个列表都有数千个单词,而我有数千个列表)。

我一直在尝试用 numpy 加快速度。我为每个单词生成了一个唯一的数字代码,所以我可以使用 numpy.bincount(因为它只适用于整数,而不适用于字符串)。但我得到“ValueError:数组太大”。

所以现在我正在尝试调整 numpy.histogram 函数的“bins”参数,使其返回我需要的频率计数(不知何故 numpy.histogram 似乎对大数组没有问题)。但到目前为止还不好。有没有人碰巧以前做过这个?甚至可能吗?有没有我看不到的更简单的解决方案?

4

3 回答 3

6

不要为此使用 numpy 。改为使用collections.Counter。它专为此用例而设计。

于 2013-06-05T10:16:27.023 回答
5

为什么不使用以下方法将整数减少到最小值numpy.unique

original_keys, lookup_vals = numpy.unique(big_int_string_array, return_inverse=True)

然后您可以使用numpy.bincounton lookup_vals,如果您需要取回原始字符串唯一整数,您可以使用 as 的值lookup_vals作为索引original_keys

所以,像:

import binascii
import numpy

string_list = ['a', 'b', 'c', 'a', 'b', 'd', 'c']
int_list = [binascii.crc32(string)**2 for string in string_list]

original_keys, lookup_vals = numpy.unique(int_list, return_inverse=True)

bins = bincount(lookup_vals)

此外,它避免了对整数求平方的需要。

于 2013-06-04T22:25:02.170 回答
1

Thiago,您也可以使用 scipy 的 itemfreq 方法直接从分类变量中尝试。这是一个例子:

>>> import scipy as sp
>>> import scipy.stats
>>> rv = ['do', 're', 'do', 're', 'do', 'mi']
>>> note_frequency = sp.stats.itemfreq(rv)
>>> note_frequency
array([['do', '3'],
       ['mi', '1'],
       ['re', '2']],
      dtype='|S2')
于 2014-10-31T23:14:11.440 回答