小编Gan*_*dar的帖子

在python中向量化特征哈希

我想知道是否有人知道如何在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])
Run Code Online (Sandbox Code Playgroud)

在特征散列中,h表示我正在散列x到的新向量的索引,即散列向量的索引0应该有4和6求和,索引1应该有4,0和1求和,等等.散列矢量应该是:

    w = np.array([ 10, 5, 10, 10, 6])
Run Code Online (Sandbox Code Playgroud)

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

    for itr in range(hashlen):
        w[itr] = np.sum(x[np.where(h==itr)])
Run Code Online (Sandbox Code Playgroud)

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

我想做的事情如下:

    w = np.zeros(hashlen)
    w[h]+= x
Run Code Online (Sandbox Code Playgroud)

但是,结果与此相同

    w = np.zeros(hashlen)
    w[h] = x
Run Code Online (Sandbox Code Playgroud)

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

python arrays hash numpy vectorization

5
推荐指数
1
解决办法
608
查看次数

Pandas 多索引数据框将列中的第一行设置为 0

我在处理 Pandas 中的分组对象时遇到了一些麻烦。具体来说,我希望能够将列中的第一行设置为 0,同时保持其他行不变。

例如:

df = pd.DataFrame({'A': ['foo', 'bar', 'baz'] * 2,
                        'B': rand.randn(6),
                        'C': rand.rand(6) > .5})
Run Code Online (Sandbox Code Playgroud)

给我

    A         B      C
0  foo  1.624345  False
1  bar -0.611756   True
2  baz -0.528172  False
3  foo -1.072969   True
4  bar  0.865408  False
5  baz -2.301539   True
Run Code Online (Sandbox Code Playgroud)

我将它们按 A 分组并按 B 对它们进行排序:

f = lambda x: x.sort('B', ascending=True)
sort_df = df.groupby('A',sort=False).apply(f)
Run Code Online (Sandbox Code Playgroud)

得到这个:

         A         B      C
    A                          
foo 3  foo -1.072969   True
    0  foo  1.624345  False
bar 1  bar -0.611756   True …
Run Code Online (Sandbox Code Playgroud)

python multi-index pandas split-apply-combine

5
推荐指数
1
解决办法
2478
查看次数

sklearn - 如何使用TfidfVectorizer来使用整个字符串?

我有这个问题,我使用我的数据集中的所有URL的主机名作为功能.我无法弄清楚如何使用TfidfVectorizer仅从URL中提取主机名并计算其权重.例如,我有一个数据帧df,其中'url'列包含我需要的所有URL.我以为我必须这样做:

def preprocess(t):
    return urlparse(t).hostname

tfv = TfidfVectorizer(preprocessor=preprocess)

tfv.fit_transform([t for t in df['url']])
Run Code Online (Sandbox Code Playgroud)

它似乎没有这种方式工作,因为它拆分主机名而不是将它们视为整个字符串.我认为这与analyzer ='word'(默认情况下)有关,它将字符串拆分为单词.

任何帮助将不胜感激,谢谢!

python preprocessor nlp scikit-learn

3
推荐指数
1
解决办法
2067
查看次数