2017-07-16 93 views
0
def get_column_normalized_matrix(A): 
    d=sp.csr_matrix.get_shape(A)[0]   
    Q=mat.zeros((d,d)) 
    V=mat.zeros((1,d)) 
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V) 
    for i in range(0,d): 
     if V[0,i]!=0: 
      Q[:,i]=sc.divide(A[:,i],V[0,i]) 
    return Q 

輸入A是稀疏format.I的鄰接矩陣我得到上面的錯誤爲:值錯誤:與序列設置一個數組元素

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 8, in get_column_normalized_matrix 
ValueError: setting an array element with a sequence. 
+0

你可能會在這裏粘貼堆棧跟蹤而不是使用圖像。 – Grimmy

+0

看看'sc.divide(...)'。它是什麼?它是一個適合'Q [:,i]'的數組嗎?如果您也使用密集陣列演示此操作,例如'A.A'。 – hpaulj

回答

0

你的問題是,您要將稀疏矩陣分配給密集矩陣。這不是自動完成的。這是相當簡單的修復,不過,通過轉動稀疏矩陣成緻密之一,採用.todense()

import scipy.sparse as sp 
import numpy.matlib as mat 
import scipy as sc 

def get_column_normalized_matrix(A): 
    d=sp.csr_matrix.get_shape(A)[0] 
    Q=mat.zeros((d,d)) 
    V=mat.zeros((1,d)) 
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V) 
    for i in range(0,d): 
     if V[0,i]!=0: 
      # Explicitly turn the sparse matrix into a dense one: 
      Q[:,i]=sc.divide(A[:,i],V[0,i]).todense() 
    return Q 

如果你不是要輸出爲疏,那麼你必須確保你的輸出矩陣Q是稀疏開始。

def get_column_normalized_matrix(A): 
    d=sp.csr_matrix.get_shape(A)[0] 
    Q=sp.csr_matrix(A) # Create sparse output matrix 
    V=mat.zeros((1,d)) 
    sp.csr_matrix.sum(A,axis=0,dtype='int',out=V) 
    for i in range(0,d): 
     if V[0,i]!=0: 
      # Update sparse matrix 
      Q[:,i]=sc.divide(A[:,i],V[0,i]) 
    return Q 

可以看出,Q創建爲A副本:這可以如下實現。這使得兩個矩陣中的相同元素都不爲零,這確保了有效更新,因爲不會添加新元素。

+0

但是我希望Q也是一個稀疏矩陣。所以我應該在下一步再次將Q轉換爲稀疏格式?對於大型矩陣,它不是非常低效和緩慢嗎? –

+0

您將'Q'定義爲密集。試圖將稀疏行放入它中,即使它行得通,也不會使其變得稀疏。 – hpaulj

+0

但我必須將Q初始化爲零矩陣。由於沒有稀疏符號,所以我必須將它初始化爲一個稠密矩陣。 –

相關問題