2011-07-21 37 views
4

我是Python的新手,所以如果這是一個基本問題,請提前原諒我,但是我已經搜索並沒有找到令人滿意的答案。在SciPy中,csr_matrices的花哨索引

我試圖做的使用與NumPy和SciPy的以下內容:

I,J = x[:,0], x[:1]    # x is a two column array of (r,c) pairs 
V = ones(len(I)) 
G = sparse.coo_matrix((V,(I,J))) # G's dimensions are 1032570x1032570 
G = G + transpose(G) 
r,c = G.nonzero() 
G[r,c] = 1 
... 
NotImplementedError: Fancy indexing in assignment not supported for csr matrices 

好看多了,我希望所有的非零值,添加轉後等於1,但我得到了花哨的索引錯誤消息。

或者,如果我能證明矩陣G是對稱的,則不需要添加轉置。

任何洞察任何方法將非常感激。

+0

如果您只想讓所有內容都等於1,那麼您只需執行'G = G/G' –

+0

輝煌。謝謝:) – will

回答

6

除了做類似G = G/G之外,您可以在G.data上操作。

所以,你的情況,無論是做:

G.data = np.ones(G.nnz) 

G.data[G.data != 0] = 1 

會做你想要什麼。這是更靈活的,因爲它允許您預成型其他類型的過濾器(例如G.data[G.data > 0.9] = 1G.data = np.random.random(G.nnz)

第二個選項只會將值設置爲1,如果它們具有非零值。在一些計算過程中,您將得到零值「密集」(即它們實際存儲爲稀疏數組中的值)。 (您可以用G.eliminate_zeros()在原地刪除這些文件)

+0

謝謝。那正是我所期待的。 – will