2014-07-09 52 views
6

我想操縱稀疏矩陣中的一些數據。一旦我創建了一個,我該如何添加/更改/更新其中的值?這看起來非常基本,但我無法在稀疏矩陣類的文檔中或在Web上找到它。我想我錯過了一些至關重要的事情。如何使用scipy編輯稀疏矩陣中的單元格?

這是我失敗的嘗試,以同樣的方式,我會正常的數組。

>>> from scipy.sparse import bsr_matrix 
>>> A = bsr_matrix((10,10)) 
>>> A[5][7] = 6 

Traceback (most recent call last): 
    File "<pyshell#11>", line 1, in <module> 
    A[5][7] = 6 
    File "C:\Python27\lib\site-packages\scipy\sparse\bsr.py", line 296, in __getitem__ 
    raise NotImplementedError 
NotImplementedError 

回答

1

的BSR的文檔是在這裏bsr matrix和企業社會責任是這裏csr matrix。在轉移到bsr之前,理解csr可能是值得的。唯一的區別是bsr自身具有條目,而csr中的基本單元是標量。

我不知道是否有超級簡單的方法來操縱矩陣一旦被創建,但在這裏是你試圖做一些例子,

import numpy as np 
from scipy.sparse import bsr_matrix, csr_matrix 

row = np.array([5]) 
col = np.array([7]) 
data = np.array([6]) 
A = csr_matrix((data,(row,col))) 

這是一個簡單的語法在其中列出陣列中所有想要的數據data,然後使用rowcol指定數據應該到達的位置。請注意,這將使矩陣尺寸足夠大,以將元素保存在最大的行和列中(在這種情況下爲6x8矩陣)。您可以使用todense()方法以標準形式查看矩陣。

A.todense() 

但是,您無法使用此模式來動態調整矩陣。你可以做的是修改矩陣的本地scipy表示。這涉及3個屬性,indicesindptrdata。首先,我們可以檢查我們已經創建的數組的這些屬性的值。

>>> print A.data 
array([6]) 

>>> print A.indices 
array([7], dtype=int32) 

>>> print A.indptr 
array([0, 0, 0, 0, 0, 0, 1], dtype=int32) 

data是它以前一樣的東西,的值的1-d陣列,我們希望在基質中。區別在於現在這個數據的位置由indicesindptr指定,而不是rowcolindices非常簡單。它只是列出每個數據條目所在的列。它將始終是相同的大小和data陣列。 indptr有點棘手。它可以讓數據結構知道每個數據項是哪一行,若要從文檔報價,

i行的列索引存儲在indices[indptr[i]:indptr[i+1]]

從這個定義可以看出, indptr的大小將始終是矩陣+ 1中的行數。需要一點時間才能習慣它,但通過每行的值的工作會給你一些直覺。請注意,所有條目都是零,直到最後一個。這意味着行i=0-4的列索引將被存儲在indices[0:0]即空陣列中。這是因爲這些行都是零。最後,在最後一行,i=5我們得到indices[0:1]=7它告訴我們數據輸入(IES)data[0:1]是第5行7列

現在假設我們想在行2列4增加值10。我們首先把它放到data屬性,

A.data = np.array([10,6]) 

接下來我們更新indices指示柱10將在,

A.indices = np.array([4,7], dtype=np.int32) 

,最後我們表明它會通過修改indptr

在哪一行
A.indptr = np.array([0,0,0,1,1,1,2], dtype=np.int32) 

重要的是你要使數據類型爲indicesindptrnp.int32。一種可視化indptr中發生的事情的方法是,當您從具有數據的行的i移動到i+1時,會發生數字更改。另外要注意,像這樣的陣列可用於構建稀疏矩陣

B = csr_matrix((data,indices,indptr)) 

這將是很好,如果它是簡單地索引到數組你嘗試過一樣容易,但執行是還沒有。這應該足以讓你至少開始。

5

有幾種稀疏矩陣格式。有些更適合索引。一個已經實現它的是lil_matrix

Al = A.tolil() 
Al[5,7] = 6 # the normal 2d matrix indexing notation 
print Al 
print Al.A # aka Al.todense() 
A1 = Al.tobsr() # if it must be in bsr format 

每種格式的文檔都表明它擅長什麼以及哪裏不好。但是它並沒有一個清晰的列表,哪些操作定義了哪個。

Advantages of the LIL format 
    supports flexible slicing 
    changes to the matrix sparsity structure are efficient 
    ... 
Intended Usage 
    LIL is a convenient format for constructing sparse matrices 
    ... 

dok_matrix也實施索引。

coo_matrix的底層數據結構很容易理解。它實質上是coo_matrix((data, (i, j)), [shape=(M, N)])定義的參數。要創建相同的矩陣,你可以使用:

sparse.coo_matrix(([6],([5],[7])), shape=(10,10)) 

如果您有更多的任務,構建更大dataij列表(或一維數組),當完成構建稀疏矩陣。