【问题标题】:Can I trick numpy.histogram into behaving like numpy.bincount?我可以欺骗 numpy.histogram 使其表现得像 numpy.bincount 吗?
【发布时间】: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 模块)。这些都是很大的数字。更糟糕的是:为了确保所有数字代码都是正数,我正在对这些数字进行平方。我会找到一些方法来产生更小的数字代码——我猜这应该可以解决问题。非常感谢!

标签: python numpy histogram


【解决方案1】:

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

【讨论】:

  • 如果问题与描述的一样,这显然是正确的方法!
  • 太棒了!干净且超快。
【解决方案2】:

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

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

然后您可以在lookup_vals 上使用numpy.bincount,如果您需要取回原始字符串唯一整数,您可以使用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)

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

【讨论】:

    【解决方案3】:

    蒂亚戈, 您也可以使用 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')
    

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2010-10-12
      • 1970-01-01
      • 2013-08-21
      • 2021-06-23
      • 1970-01-01
      相关资源
      最近更新 更多