【发布时间】:2013-05-31 10:51:59
【问题描述】:
所以,我有单词列表,我需要知道每个单词出现在每个列表中的频率。使用“.count(word)”可以,但是太慢了(每个列表都有数千个单词,而我有数千个列表)。
我一直在尝试使用 numpy.我为每个单词生成了一个唯一的数字代码,所以我可以使用 numpy.bincount (因为它只适用于整数,而不适用于字符串)。但我得到“ValueError:数组太大”。
所以现在我正在尝试调整 numpy.histogram 函数的“bins”参数,使其返回我需要的频率计数(不知何故 numpy.histogram 似乎对大数组没有问题)。但到目前为止还不好。有没有人碰巧以前做过这个?甚至可能吗?有没有我看不到的更简单的解决方案?
【问题讨论】:
-
你的阵列有多大!?我只是将 bincount 与 10000000 长度的整数数组一起使用,它工作得很好。在我得到你做的错误之前,我的内存已经用完了。
-
我认为这里的问题涉及您独特的数字代码系统,而不是初始数组的大小。 np.bincount 将创建一个长度等于 1 + 数组中最大整数的数组,如果您使用某种编码非常大的数字,则可能会导致问题。不过,我对 np.bincount([1000000000]) 没有任何问题。你的数字编码方案是什么?
-
啊,当您尝试合并的整数很大时,似乎会发生错误。您可以使用
foo = numpy.random.randint(2**62, size=1000); numpy.bincount(foo)模拟它。我猜它正在尝试创建一个巨大的不可索引数组来存储所有垃圾箱,而 numpy 说不(该错误在multiarray/ctors.c中)。你有多少字? -
Henry 和 cge,我认为你们都在现场。为了创建数字代码,我使用了 binascii.crc32 函数(来自 binascii 模块)。这些都是很大的数字。更糟糕的是:为了确保所有数字代码都是正数,我正在对这些数字进行平方。我会找到一些方法来产生更小的数字代码——我猜这应该可以解决问题。非常感谢!