【问题标题】:Efficient way to populate a sparse matrix in Python在 Python 中填充稀疏矩阵的有效方法
【发布时间】: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


    【解决方案1】:

    首先使用 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())
    

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

    【讨论】:

    • 谢谢,这行得通!但是,我是否正确理解这首先从中产生一个密集矩阵,然后将其变成一个稀疏矩阵?理想情况下,我想直接创建一个稀疏矩阵,因为我使用稀疏矩阵的动机是为了节省内存,如果我创建完整的密集矩阵,我不会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2018-05-06
    • 1970-01-01
    • 2018-08-07
    • 2014-05-12
    相关资源
    最近更新 更多