50Kx50K稀疏矩阵

时间:2012-12-07 11:54:42

标签: numpy scipy sparse-matrix

我需要保持50,000x50,000稀疏矩阵/ 2d阵列,约5%的细胞均匀分布,非空。我需要:

编辑我需要在numpy / scipy中执行此操作,抱歉,如果不清楚的话。另外,增加了要求。

  1. 从数据库中读取5%非空数据,并尽快将其分配给矩阵/ 2d阵列单元格。
  2. 尽量少用内存。
  3. 使用花式索引(比如列中的索引和所有非空值)。这是很好的,内存和构造时间更重要。
  4. 构建后,矩阵不会改变。
  5. 但是,我会想要进行转置,最好是O(1)记忆和时间。
  6. 实现这一目标的最有效方法是什么? 我可以用nan而不是零来表示“空”细胞吗? (0对我来说是一个有效的值),我能否有效地运行nansum,nanmean? 如果没有,我可以有效地获取给定列/行中所有非零的索引和值吗?

2 个答案:

答案 0 :(得分:1)

http://en.wikipedia.org/wiki/Sparse_matrix对几种不同的方法有很好的总结。如果您从网站检索的数据是无序的,我建议使用“列表列表”(或者在这种情况下更有效 - 可能是列/值对列表的数组)。如果您能保证订购,我建议使用'Yale格式'。这两种解决方案都不需要存储NAN,并且可以快速制作nanmean / nanaverage。

但这些解决方案提供了慢速插入。这些解决方案将使用整个矩阵的大约10%的空间。

答案 1 :(得分: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中运行此功能表明这确实很快。