在Python

时间:2018-04-10 10:00:45

标签: python sparse-matrix

我正在尝试设置期刊共同出现的稀疏矩阵(dok_matrix)。不幸的是,我的解决方案(太)效率低下无法使用,我无法在线找到任何解决方案。

编辑:我还想直接创建稀疏矩阵,而不是首先创建一个密集矩阵然后将其转换为稀疏矩阵。

我从一个数据框开始,说明某些期刊被引用的频率。在这个例子中,自然和科学被一起引用了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]         

1 个答案:

答案 0 :(得分:0)

首先使用pandas来塑造矩阵 -

dok_matrix(pd.concat([df, df.rename(index=str, columns={'journal_1' : 'journal_2', 'journal_2' : 'journal_1'})], axis=0).pivot(index='journal_1', columns = 'journal_2', values = 'no_combs').as_matrix())

我首先将反向journal1作为日志2附加,然后旋转以形成正确的形状,然后转换为矩阵,然后转换为dok_matrix