2

在我的代码中,我目前正在迭代并创建三个列表:

data, row, col

对的重复率很高(row, col),在我的最终稀疏矩阵中,M我希望 的值是M[row, col]中所有相应元素的总和data。通过阅读文档,coo_matrix格式看起来很完美,对于小例子来说它工作得很好。

我遇到的问题是,当我扩大问题规模时,看起来中间列表data, row, col正在用完我所有的(8gb)内存和交换空间,我的脚本被自动杀死。

所以我的问题是:

是否有适当的格式或有效的方法来增量构建我的求和矩阵,这样我就不必存储完整的中间列表/numpy 数组?

我的程序在网格上循环,在每个点创建local_data, local_row, local_col列表,然后将其元素附加到data, row, col,因此能够根据稀疏矩阵构造函数使用列表更新稀疏矩阵将是理想的情况。

4

1 回答 1

3

有两件事可能会杀死你:重复或数组上列表的开销。在任何一种情况下,可能正确的做法是在将列表放入 acoo_matrix并将其添加到总数之前将其扩大到如此之大。我花了几个时间:

rows = list(np.random.randint(100, size=(10000,)))
cols = list(np.random.randint(100, size=(10000,)))
values = list(np.random.rand(10000))

%timeit sps.coo_matrix((values, (rows, cols)))
100 loops, best of 3: 4.03 ms per loop

%timeit (sps.coo_matrix((values[:5000], (rows[:5000], cols[:5000]))) +
         sps.coo_matrix((values[5000:], (rows[5000:], cols[5000:]))))
100 loops, best of 3: 5.24 ms per loop

%timeit sps.coo_matrix((values[:5000], (rows[:5000], cols[:5000])))
100 loops, best of 3: 2.16 ms per loop

coo_matrix因此,将列表一分为二,将每个列表转换为 a ,然后将它们加在一起,大约有 25% 的开销。如果您进行更多拆分,它似乎并没有那么糟糕:

%timeit (sps.coo_matrix((values[:2500], (rows[:2500], cols[:2500]))) +   
         sps.coo_matrix((values[2500:5000], (rows[2500:5000], cols[2500:5000]))) +  
         sps.coo_matrix((values[5000:7500], (rows[5000:7500], cols[5000:7500]))) + 
         sps.coo_matrix((values[7500:], (rows[7500:], cols[7500:]))))
100 loops, best of 3: 5.76 ms per loop
于 2013-09-23T16:30:50.823 回答