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

Par*_*val 6 python numpy histogram

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

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

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

Rob*_*ern 6

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


Hen*_*all 5

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

original_keys, lookup_vals = numpy.unique(big_int_string_array, return_inverse=True)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用numpy.bincounton lookup_vals,如果你需要取回原始字符串唯一整数,你可以使用lookup_valsas作为索引的值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)
Run Code Online (Sandbox Code Playgroud)

此外,它避免了对整数进行平方的需要.