2017-06-14 169 views
0

我有一個scipy CSR矩陣,我想獲取每行的元素列索引。我的做法是:稀疏矩陣:如何獲得每行的非零索引

import scipy.sparse as sp 
N = 100 
d = 0.1 
M = sp.rand(N, N, d, format='csr') 

indM = [row.nonzero()[1] for row in M] 

INDM正是我需要的,它有相同數量的行爲M,看起來像這樣:

[array([ 6, 7, 11, ..., 79, 85, 86]), 
array([12, 20, 25, ..., 84, 93, 95]), 
... 
array([ 7, 24, 32, 40, 50, 51, 57, 71, 74, 96]), 
array([ 1, 4, 9, ..., 71, 95, 96])] 

的問題是,與大矩陣這種方法看起來很慢。 有什麼辦法避免列表理解或以某種方式加快速度?

謝謝。

回答

3

你可以簡單地直接使用indicesindptr屬性:

import numpy 
import scipy.sparse 

N = 5 
d = 0.3 
M = scipy.sparse.rand(N, N, d, format='csr') 
M.toarray() 
# array([[ 0.  , 0.  , 0.  , 0.  , 0.  ], 
#  [ 0.  , 0.  , 0.  , 0.  , 0.30404632], 
#  [ 0.63503713, 0.  , 0.  , 0.  , 0.  ], 
#  [ 0.68865311, 0.81492098, 0.  , 0.  , 0.  ], 
#  [ 0.08984168, 0.87730292, 0.  , 0.  , 0.18609702]]) 

M.indices 
# array([1, 2, 4, 3, 0, 1, 4], dtype=int32) 
M.indptr 
# array([0, 3, 4, 6, 6, 7], dtype=int32) 

numpy.split(M.indices, M.indptr)[1:-1] 
# [array([], dtype=int32), 
# array([4], dtype=int32), 
# array([0], dtype=int32), 
# array([0, 1], dtype=int32), 
# array([0, 1, 4], dtype=int32)] 
+0

大,謝謝! –

+0

'M.tolil()。rows'給出一個具有相同值列表的對象數組。 – hpaulj