2013-10-13 153 views
2

我在Python中有3個循環的問題。 該代碼的目的是根據(x)未知值的數量(DATA)計算稀疏矩陣。這裏,x數是13,這意味着DATA的非重複值:(0,4,8,12,16,20,21,22,23,24,25,26,27)。然後,len(DATA)是4,表示A_sparse矩陣的行數。然後,我創建了具有形狀的稀疏零矩陣(4,13)。然後,我將部分的值設爲A_sparse如果x等於未知值。如何避免循環稀疏矩陣?

問題

  • 此代碼正常工作,但與循環!我應該刪除循環,但是 怎麼樣?

在這裏,我把下面的例子:

輸入:

  • DATA - 表示指數; [[24,20,21,22,23],[24,25,26,27],[25,26,27,23],[0,4,8,12,16,20]]
  • PORTION - [[1.16950604,0.08724138,1.5326188,1.5326188,0.74587448], [0.44409055,1.51394507,1.51394507,0.95883188], [0.77097384,1.77917041,0.14615981,0.185952], [0.93,1.5,1.5,1.5,1.5,0.07 ]

輸出: - A_sparse - 稀疏矩陣;

def get_sparse(DATA, PORTION): 

    x = np.unique(flatten(DATA)) 
    A = np.zeros((len(DATA), len(x))) 

    for i in range(len(DATA)): 
     for m1,m2 in enumerate(DATA[i]): 
      for j,k in enumerate(x): 
        if float(m2) == float(k): 
          A[i][j] = PORTION[i][m1] 
    return A 


>>> get_sparse(DATA, PORTION) 
array([[ 0.  , 0.  , 0.  , 0.  , 0.  , 
    0.08724138, 1.5326188 , 1.5326188 , 0.74587448, 1.16950604, 
    0.  , 0.  , 0.  ], 
    [ 0.  , 0.  , 0.  , 0.  , 0.  , 
    0.  , 0.  , 0.  , 0.  , 0.44409055, 
    1.51394507, 1.51394507, 0.95883188], 
    [ 0.  , 0.  , 0.  , 0.  , 0.  , 
    0.  , 0.  , 0.  , 0.185952 , 0.  , 
    0.77097384, 1.77917041, 0.14615981], 
    [ 0.93  , 1.5  , 1.5  , 1.5  , 1.5  , 
    0.07  , 0.  , 0.  , 0.  , 0.  , 
    0.  , 0.  , 0.  ]]) 

我常常不喜歡,當我使用Python使用循環,所以,我想消除環路,使這個代碼更短,速度更快。 任何答案將不勝感激!

+1

嘗試[這裏](http://docs.scipy.org/doc/scipy/reference/sparse.html)即SciPy稀疏矩陣包。 –

+0

Kobi,謝謝,我翻翻了!但是,我不熟悉Scipy稀疏矩陣工具,我只知道數學,但我不能真正將其轉換爲我上面提到的問題..?我怎樣才能做到這一點?? – Spider

+0

我在我的答案中增加了一個稀疏的例子 – hpaulj

回答

1

鑑於DATA和PORTION列表的不規則列表性質,這個問題的一個numpy向量化並不明顯。然而,它幫助我,如果我打印get_sparse(DATA, DATA)以可視化的構造函數:

[[ 0 0 0 0 0 20 21 22 23 24 0 0 0] 
[ 0 0 0 0 0 0 0 0 0 24 25 26 27] 
[ 0 0 0 0 0 0 0 0 23 0 25 26 27] 
[ 0 4 8 12 16 20 0 0 0 0 0 0 0]] 

那些看上去像是普通的列數,除了第一批一步4.這是你版本功能構建一個(4,28)陣列,然後修剪zero列。

def get_sparse(DATA, PORTION): 
    x = np.unique(itertools.chain(*DATA)) 
    A = np.zeros((len(DATA), max(x)+1)) 
    for a, d, p in zip(A, DATA, PORTION): 
     a[d] = p 
    return A[:,x] 

要使用稀疏矩陣,嘗試:名單

from scipy import sparse 
A = sparse.lil_matrix((4,28)) 
A.data = PORTION 
A.rows = DATA 

數據及定量名單完全lil_matrix類型的內部格式相匹配。一旦構建,A可以轉換爲數學或切片的其他稀疏類型之一。 A.toarray()給出了完整的「密集」形式。