2013-08-03 35 views
1

我有以下矩陣,我認爲是稀疏的。我試圖轉換到密集使用x.dense格式,但它從來沒有工作。有關如何做到這一點的任何建議?,謝謝。如何將稀疏矩陣轉換爲使用python的密集形式

mx=[[(0, 2), (1, 1), (2, 1), (3, 1), (4, 1), (5, 3), (6, 4), (7, 2), (8, 5), (9, 1)], 
[(10, 1), (11, 5), (12, 2), (13, 1), (21, 1), (22, 1), (23, 1), (24, 1), (25, 1), (26, 2)], 
[(27, 2), (28, 1), (29, 1), (30, 1), (31, 2), (32, 1), (33, 1), (34, 1), (35, 1), (36, 1)]] 

有人提出了下面的解決方案,但有沒有更好的辦法?

def assign_coo_to_dense(sparse, dense): 
    dense[sparse.row, sparse.col] = sparse.data 

mx.todense()。 預期輸出應該以這種形式出現:[[2,1,1,1,1,3,4],[1,5,2,1,1,1,1],[2,1,1,1 ,2,1,1,1]

+0

您是否使用numpy的或SciPy的? – Floris

+0

嗨弗洛里斯,我使用numpy,但似乎大多數人已經解決了類似的問題,使用scipy。 – Tiger1

+0

@ Tiger1是'mx'包含索引或值的矩陣嗎?在SciPy中,您需要稀疏矩陣的最大維數爲2,這似乎不是您的情況... –

回答

2

列表理解是最簡單的方法:

new_list = [[b for _,b in sub] for sub in mx] 

結果:

>>> new_list 
[[2, 1, 1, 1, 1, 3, 4, 2, 5, 1], [1, 5, 2, 1, 1, 1, 1, 1, 1, 2], [2, 1, 1, 1, 2, 1, 1, 1, 1, 1]] 
+0

最後一個答案忽略了整個「這是什麼樣的數據」紅鯡魚,並得到了「這裏是你從輸入你如何得到你想要的輸出」。 – Floris

+0

@AKavall,感謝您的解決方案。它正是我所尋找的。 – Tiger1

1

源數據真的不符合任何在SciPy的(見http://docs.scipy.org/doc/scipy/reference/sparse.htmlhttp://en.wikipedia.org/wiki/Sparse_matrix)由稀疏矩陣支持內置的格式,因此使用.todense()不會真正成爲生產力在這裏。特別是,如果你有這樣的:

import numpy as np 

my_sparseish_matrix = np.array([[(1, 2), (3, 4)]]) 

然後my_sparseish_matrix將已經密集numpy的陣列!在這一點上調用.todense()會產生一個錯誤,無論如何也是沒有意義的。

所以我的建議是明確使用一對for循環來構建密集陣列。要做到這一點,你需要知道你的結果矢量有多少物品 - 稱之爲N

dense_vector = np.zeros((N,), int) 
for inner in mx: 
    for index, value in inner: 
     dense_vector[index] = value 
+0

Thanks @ Imjohns3,當實際數據集包含數千個文檔(多達一百萬個項目)時,如何知道N的值?這裏是一個代碼,它也可以維護列表中的項目順序:q = [] for doc in corpus_tfidf: j =([i [1] for i in doc]) q.append(j ) – Tiger1

+0

哦,哇,這與我以爲你問的完全不同!在你的問題中指定這將是有幫助的。 – lmjohns3

+0

嗨Imjohns3,感謝您的解決方案。它工作,但每個項目應該是一個列表;值以逗號分隔。請參閱更新的問題。謝謝 – Tiger1

1

這裏是做你問了一個非常哈克的方式:

dense = [[int(''.join(str(val) for _, val in doc))] for doc in mx] 

基本上它從嵌套的元組的每個值轉換成字符串並連接所有這些串起來,然後將其轉換那回到一個整數。重複每個元素mx

相關問題