我需要保持50,000x50,000稀疏矩阵/ 2d阵列,约5%的细胞均匀分布,非空。我需要:
编辑我需要在numpy / scipy中执行此操作,抱歉,如果不清楚的话。另外,增加了要求。
实现这一目标的最有效方法是什么? 我可以用nan而不是零来表示“空”细胞吗? (0对我来说是一个有效的值),我能否有效地运行nansum,nanmean? 如果没有,我可以有效地获取给定列/行中所有非零的索引和值吗?
答案 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
中运行此功能表明这确实很快。