【发布时间】:2018-04-10 10:00:45
【问题描述】:
我正在尝试设置期刊共现的稀疏矩阵 (dok_matrix)。不幸的是,我的解决方案(太)效率低下无法使用,而且我在网上找不到任何解决方案。
编辑:我也想直接创建稀疏矩阵,而不是先创建一个密集矩阵,然后将其转换为稀疏矩阵。
我从某个期刊一起被引用的频率的数据框开始。在这个例子中,Nature 和 Science 一起被引用了 3 次。我想最终得到一个稀疏的对称矩阵,其中行和列是期刊,非空条目是这些期刊一起被引用的频率。即,这里的完整矩阵将有四行(Lancet、Nature、NEJM、Science)和四列(Lancet、Nature、NEJM、Science)和三个非零条目。由于我的真实数据要大得多,我想使用稀疏矩阵表示。
我目前在我的代码中所做的是用我的 Dataframe 中的值更新非零条目。不幸的是,期刊名称的比较非常耗时,我的问题是,是否有更快的方法在这里设置稀疏矩阵。
我的理解是我的数据框无论如何都接近 dok_matrix,日志组合相当于用作 dok_matrix 中的键的元组。但是,我不知道如何进行这种转换。
感谢任何帮助!
# Import packages
import pandas as pd
from scipy.sparse import dok_matrix
# Set up dataframe
d = {'journal_comb': ['Nature//// Science', 'NEJM//// Nature', 'Lancet//// NEJM'], 'no_combs': [3, 5, 6], 'journal_1': ['Nature', 'NEJM', 'Lancet'], 'journal_2': ['Science', 'Nature', 'NEJM']}
df = pd.DataFrame(d)
# Create list of all journal titles
journal_list = list(set(set(list(df['journal_1'])) | set(list(df['journal_2']))))
journal_list.sort()
# Set up empty sparse matrix with final size
S = dok_matrix((len(journal_list), len(journal_list)))
# Loop over all journal titles and get value from Dataframe for co-occuring journals
# Update sparse matrix value with value from Dataframe
for i in range(len(journal_list)):
print i
# Check whether journal name is actually in column 'journal_1'
if len(df[(df['journal_1'] == journal_list[i])]) > 0:
for j in range(len(journal_list)):
# If clause to circumvent error due to empty series if journals are not co-cited
if len(df[(df['journal_1'] == journal_list[i]) & (df['journal_2'] == journal_list[j])]['no_combs']) == 1:
# Update value in sparse matrix
S[i, j] = df[(df['journal_1'] == journal_list[i]) & (df['journal_2'] == journal_list[j])]['no_combs'].iloc[0]
【问题讨论】:
标签: python sparse-matrix