我想知道是否有人知道如何在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)
如果我在这里遗失了什么,谁能告诉我?或者,如果有一种"简单"的方法来进行不涉及太多计算的特征散列?
我在处理 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) 我有这个问题,我使用我的数据集中的所有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 ×3
arrays ×1
hash ×1
multi-index ×1
nlp ×1
numpy ×1
pandas ×1
preprocessor ×1
scikit-learn ×1