2

我需要保存一个 50,000x50,000 稀疏矩阵/二维数组,其中约 5% 的单元格均匀分布且非空。我将需要:

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

  1. 从数据库中读取 5% 的非空数据,并尽快将其分配给矩阵/二维数组单元。
  2. 使用尽可能少的内存。
  3. 使用花哨的索引(例如,获取列中所有非空值的索引)。这是不错的选择,内存和构建时间更重要。
  4. 一旦构建,矩阵将不会改变。
  5. 但是,我会想要使用它的转置,最好是 O(1) 内存和时间。

实现这一目标的最有效方法是什么?我可以用 nan 而不是 0 来表示“空”单元格吗?(0 对我来说是一个有效值),我可以有效地运行 nansum、nanmean 吗?如果不是,我可以有效地获取给定列/行中所有非零的索引和值吗?

4

2 回答 2

1

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

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

于 2012-12-07T12:14:47.453 回答
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表明这确实很快。

于 2012-12-07T16:35:33.713 回答