5

我想知道是否有人知道如何在 Python 中矢量化特征散列。例如,这是我的代码:

    import numpy as np
    hashlen = 5
    x = np.array([4, 7, 4, 2, 6, 8, 0, 6, 3, 1])
    h = np.array([0, 3, 1, 2, 4, 2, 1, 0, 3, 1])

在特征散列中,h 表示我将 x 散列到的新向量的索引,即散列向量的索引 0 应该有 4 和 6 相加,索引 1 应该有 4、0 和 1 相加,等等。结果散列向量应该是:

    w = np.array([ 10, 5, 10, 10, 6])

这样做的一种方法当然是循环遍历哈希索引,即:

    for itr in range(hashlen):
        w[itr] = np.sum(x[np.where(h==itr)])

对于大向量,复杂度是 hashlen(散列向量的长度)的函数。这可能需要很长时间,尤其是其中有一个 np.where() 。

我想做类似的事情:

    w = np.zeros(hashlen)
    w[h]+= x

但是,这样做的结果是一样的

    w = np.zeros(hashlen)
    w[h] = x

如果我在这里遗漏了什么,谁能告诉我?或者,如果有一种“简单”的方式来进行不涉及太多计算的特征散列?

4

1 回答 1

5

您可以使用带有权重的 bincount 来执行您的要求:

>>> np.bincount(h,weights=x)
array([ 10.,   5.,  10.,  10.,   6.])

对于矩阵:

>>> import numpy as np
>>> a=np.random.randint(0,5,(50,50))
>>> rand=np.random.rand(5)
>>> rand
array([ 0.10899745,  0.35296303,  0.21127571,  0.56433924,  0.27895281])
>>> b=np.take(rand,a)

#Unfortunately you cannot do it like this:
>>> np.bincount(a,weights=b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: object too deep for desired array

#There we go:
>>> np.bincount(a.flat,weights=b.flat)
array([  55.04371257,  172.59892108,   96.34172236,  297.40677707,
        145.89232039])

这使用花哨的索引来查看发生了什么:

>>> np.bincount(a.flat)
array([505, 489, 456, 527, 523])
>>> np.bincount(a.flat)*rand
array([  55.04371257,  172.59892108,   96.34172236,  297.40677707,
        145.89232039])
于 2013-07-31T16:30:39.817 回答