我可以欺骗numpy.histogram表现得像numpy.bincount吗?

时间:2013-06-04 21:47:11

标签: python numpy histogram

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

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

所以现在我正在尝试调整numpy.histogram函数的“bins”参数,使其返回我需要的频率计数(不知何故numpy.histogram似乎没有大数组的麻烦)。但到目前为止还不好。那里的任何人碰巧都曾经这样做过吗?它甚至可能吗?是否有一些我没有看到的更简单的解决方案?

3 个答案:

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