2016-10-14 131 views
0

我期待劃分python 2.7中的兩個sparce matricies,本質上k = numerator/denominator,其結果是一個類型爲sp.csr_matrix的稀疏矩陣。我正在使用scipy as spnumpy as np確定一個稀疏矩陣商

爲此,我遵循分子的點積和分母的倒數的線性格式。這兩項都是格式sp.csr_matrix(([],([],[])),shape=[R,R])

對於k本身的計算是

k = sp.csr_matrix(numerator.dot(sp.linalg.inv(denominator))) 

這樣做返回警告:

SparseEfficiencyWarning: splu requires CSC matrix format 
warn('splu requires CSC matrix format', SparseEfficiencyWarning) 

什麼上面的警告意味着相於確定的k的身份之間的商兩個稀疏矩陣?

有沒有更有效的方法生成一個稀疏矩陣和稀疏矩陣在python(兩個稀疏矩陣的商)逆點積?

我以前發現Inverting large sparse matrices with scipy,但我不知道這可能是過時的。

+0

爲什麼2013年的答案會過時?你有沒有發現任何'稀疏''inv'函數或討論? – hpaulj

+0

我認爲這可能是過時的,因爲在scipy庫中的更新,從那以後我創建了一個我找不到的成員函數。沒有討論被發現的稀疏逆。 –

+0

評論指出'sparse.linalg.inv'正在起作用 - 這是我的版本。 – hpaulj

回答

2

從2013回答借款:

In [409]: a=np.random.rand(3,3) 
In [410]: A=sparse.csr_matrix(a) 
In [411]: np.linalg.inv(a) 
Out[411]: 
array([[ 26.11275413, -4.17749006, -9.82626551], 
     [-37.22611759, 9.38404027, 13.80073216], 
     [ 7.59314843, -2.04314605, -1.58410661]]) 

np INV不是sparse-aware

In [412]: np.linalg.inv(A) 
.... 
LinAlgError: 0-dimensional array given. Array must be at least two-dimensional 

隨着from scipy.sparse import linalg

In [414]: linalg.inv(A).A 
/usr/lib/python3/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py:243: SparseEfficiencyWarning: splu requires CSC matrix format 
    warn('splu requires CSC matrix format', SparseEfficiencyWarning) 
/usr/lib/python3/dist-packages/scipy/sparse/linalg/dsolve/linsolve.py:161: SparseEfficiencyWarning: spsolve is more efficient when sparse b is in the CSC matrix format 
    'is in the CSC matrix format', SparseEfficiencyWarning) 
Out[414]: 
array([[ 26.11275413, -4.17749006, -9.82626551], 
     [-37.22611759, 9.38404027, 13.80073216], 
     [ 7.59314843, -2.04314605, -1.58410661]]) 

所以使用csc格式,而不是csr

In [415]: A1=sparse.csc_matrix(a) 
In [416]: linalg.inv(A1).A 
Out[416]: 
array([[ 26.11275413, -4.17749006, -9.82626551], 
     [-37.22611759, 9.38404027, 13.80073216], 
     [ 7.59314843, -2.04314605, -1.58410661]]) 

同樣的事情,但沒有稀疏警告。沒有深入細節,inv必須使用迭代列而不是行的方法。它確實spsolve(A, I)I是一個稀疏eye矩陣)。

+0

太好了,謝謝。你能否詳細說明'csc'與'csr'之間的主要區別?我主要使用'csr'作爲遺留代碼的格式。 –

+2

'csc'基本上是'csr'的轉置。實際上'M.T',其中'M'是'csr',是'csc'具有相同的數據和指針。看看他們的'data','indices'和'indptr'屬性。 – hpaulj

+0

非常有幫助 - 我無法快速識別與「scipy」文檔的區別。謝謝! –