簡體   English   中英

在Python中填充稀疏矩陣的有效方法

[英]Efficient way to populate a sparse matrix in Python

我正在嘗試建立期刊共現的稀疏矩陣(dok_matrix)。 不幸的是,我的解決方案效率低下,無法使用,而且我無法在線找到任何解決方案。

編輯:我也想直接創建稀疏矩陣,而不是先創建一個密集矩陣,然后將其變成稀疏矩陣。

我從一個數據框架開始,該數據框架列出了某些期刊被一起引用的頻率。 在此示例中,自然和科學被一起引用了3次。 我想以一個稀疏的對稱矩陣結尾,其中行和列是日記帳,非空條目是這些日記被一起引用的頻率。 即,這里的完整矩陣將具有四行(柳葉刀,自然,NEJM,科學)和四列(柳葉刀,自然,NEJM,科學)和三個非零條目。 由於我的真實數據要大得多,因此我想使用稀疏矩陣表示。

我目前在代碼中執行的操作是使用數據框中的值更新非零條目。 不幸的是,比較期刊名稱非常耗時,而我的問題是,是否可以在此處設置稀疏矩陣的更快方法。

我的理解是,我的數據框無論如何都接近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]         

首先使用熊貓來塑造矩陣-

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM