Numpy 50Kx50K稀疏矩阵

Numpy 50Kx50K稀疏矩阵,numpy,scipy,sparse-matrix,Numpy,Scipy,Sparse Matrix,我需要持有一个50000x50000稀疏矩阵/2d数组,约5%的单元均匀分布,非空。我需要: 编辑我需要在numpy/scipy中执行此操作,如果不清楚,很抱歉。此外,还增加了一些要求 从数据库中读取5%的非空数据,并尽快将其分配给矩阵/2d阵列单元 使用尽可能少的内存 使用奇特的索引(例如,获取列中所有非空值的索引)。这很好,内存和构建时间同样重要 一旦构建,矩阵将不会改变 然而,我想用它的转置,最好是O(1)内存和时间 实现这一目标最有效的方法是什么? 我可以用nan代替0来表示“空”单元格

我需要持有一个50000x50000稀疏矩阵/2d数组,约5%的单元均匀分布,非空。我需要:

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

  • 从数据库中读取5%的非空数据,并尽快将其分配给矩阵/2d阵列单元
  • 使用尽可能少的内存
  • 使用奇特的索引(例如,获取列中所有非空值的索引)。这很好,内存和构建时间同样重要
  • 一旦构建,矩阵将不会改变
  • 然而,我想用它的转置,最好是O(1)内存和时间 实现这一目标最有效的方法是什么? 我可以用nan代替0来表示“空”单元格吗?(0对我来说是一个有效值),我能有效地运行nansum吗? 如果没有,我能否有效地获取给定列/行中所有非零的索引和值?

    对几种不同的方法进行了很好的总结。如果您从网站检索到的数据是无序的,我建议您使用“列表列表”(或者在这种情况下更有效——可能是列/值对列表数组)。如果你能保证订购,我推荐“耶鲁格式”。这两种解决方案都使存储NAN变得不必要,并使nanmean/nanaverage变得快速


    不过,这些解决方案的插入速度很慢。这些解决方案将使用整个矩阵约10%的空间。

    好吧,就我而言,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]
    
    def build_csc(N,稀疏系数):
    数据=[]
    行索引=[]
    列索引=[0]*(N+1)
    当前指数=0
    对于X范围内的j(N):
    列索引[j]=当前索引
    对于x范围内的i(N):
    如果为random.random()<稀疏系数:
    行索引追加(i)
    data.append(random.random())
    当前_指数+=1
    列索引[N]=当前索引
    返回sp.csc_矩阵((数据,行索引,列索引),shape=(N,N),dtype=np.float)
    def从列中取出列(m,列索引):
    col=m[:,col_索引]
    索引=列非零()[0]
    值=列[索引]
    
    %timeit
    中运行这个程序表明它确实很快