2012-12-07 317 views
2

我需要保持50,000x50,000稀疏矩陣/ 2D陣列,與細胞的〜5%,均勻分佈的,是非空的。我將需要:50Kx50K稀疏矩陣

編輯我需要在numpy/scipy中做到這一點,對不起,如果不清楚。另外,增加了需求。

  1. 從數據庫中讀取5%的非空數據,並儘可能快地將其分配給矩陣/ 2d數組單元格。
  2. 使用盡可能少的內存。
  3. 使用花式索引(採取的索引和所有非空值一列,說的)。這是非常好的,記憶和建設時間更重要。
  4. 一旦構建,矩陣不會改變。
  5. 然而,我會想要採取它的轉置,最好O(1)內存和時間。

什麼是實現這一目標的最有效的方法是什麼? 我可以用nan而不是零來表示「空」單元嗎? (0對我來說是一個有效的值),我可以有效地運行nansum,nanmean嗎? 如果不是,我可以有效地採用給定列/行中所有非零的索引和值嗎?

回答

1

嗯,我的目的,好像CSC是要走的路。有了5%的「稀疏因子」,csc中行索引的內存還是值得的。下面是我用來測試,我需要真正的東西是快速的代碼:

def build_csc(N, SPARSITY_FACTOR): 

    data = [] 
    row_indexes = [] 
    column_indexes = [0] * (N+1) 

    current_index = 0 
    for j in xrange(N): 
     column_indexes[j] = current_index 
     for i in xrange(N): 
      if random.random() < SPARSITY_FACTOR: 
       row_indexes.append(i) 
       data.append(random.random()) 
       current_index += 1 
    column_indexes[N] = current_index 

    return sp.csc_matrix((data,row_indexes,column_indexes), shape=(N,N), dtype=np.float) 


def take_from_col(m, col_index): 
    col = m[:,col_index] 
    indexes = col.nonzero()[0] 
    values = col[indexes] 

%timeit運行,這表明這確實是快。

1

http://en.wikipedia.org/wiki/Sparse_matrix有幾種不同的方法一個很好的總結。如果從網站檢索到的數據是無序的,我會推薦'列表列表'(或者在這種情況下更有效 - 可能是一列列/值對列表)。如果你能保證訂購,我會推薦'耶魯格式'。這兩種解決方案都不需要存儲NAN,並且可以快速實現nanmean/nanaverage。

這些解決方案雖然提供了緩慢插入。這些解決方案將使用全矩陣的大約10%的空間。