所以,我有单词列表,我需要知道每个单词在每个列表中出现的频率。使用“.count(word)”有效,但速度太慢(每个列表有数千个单词,我有数千个列表)。
我一直试图用numpy来加快速度。我为每个单词生成了一个唯一的数字代码,所以我可以使用numpy.bincount(因为它只适用于整数,而不是字符串)。但我得到“ValueError:数组太大了”。
所以现在我正在尝试调整numpy.histogram函数的“bins”参数,使其返回我需要的频率计数(不知何故numpy.histogram似乎没有大数组的麻烦)。但到目前为止还不好。那里的任何人碰巧都曾经这样做过吗?它甚至可能吗?是否有一些我没有看到的更简单的解决方案?
答案 0 :(得分:6)
不要使用numpy。请改用collections.Counter
。它专为此用例而设计。
答案 1 :(得分:5)
为什么不使用numpy.unique
将整数减少到最小值:
original_keys, lookup_vals = numpy.unique(big_int_string_array, return_inverse=True)
然后您可以在numpy.bincount
上使用lookup_vals
,如果您需要取回原始字符串唯一整数,则可以使用lookup_vals
的值作为original_keys
的索引{1}}。
所以,比如:
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)
此外,它避免了对整数进行平方的需要。
答案 2 :(得分:1)
蒂亚戈, 您也可以使用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')