猿问

如何有效地从一个数组中删除另一个数组的元素

我正在对包含大约 135k 文档(每个文档几页)和大约 800k 单词的词汇表的文本语料库进行分析。我注意到大约一半的词汇是频率为 1 或 2 的单词,所以我想删除它们。


所以我正在运行这样的东西:


remove_indices = np.array(index_df[index_df['frequency'] <= 2]['index']).astype(int)


for file_name in tqdm(corpus):

    content = corpus[file_name].astype(int)

    content = [index for index in content if index not in remove_indices]

    corpus[file_name] = np.array(content).astype(np.uint32)

哪里corpus看起来像:


{

    'filename1.txt': np.array([43, 177718, 3817, ...., 28181]).astype(np.uint32),

    'filename2.txt': ....

}

并且每个单词之前都被编码为正整数索引。


问题在于每次迭代content = [index for index in content if index not in remove_indices]需要进行多少次检查。len(remove_indices) * len(content)这将花费很长时间(tqdm 告诉我 100h+)。关于如何加快速度的任何提示?


到目前为止我试过的


利用如果单词只有频率 1 或 2 的事实,我们可以在它remove_indices从语料库中删除后将其删除。仍然需要永远...


慕的地10843
浏览 111回答 1
1回答

哈士奇WWW

您可以使用numpy.isin()方法或者,您可以创建一个set现有的单词/索引。那么这个in操作将是一个 O(1) 而不是 O(n) (其中 n 是数组的长度)。
随时随地看视频慕课网APP

相关分类

Python
我要回答