在我的代码中,我正在迭代并创建三个列表:
data, row, col
(row, col)
对的重复次数很高,在我的最终稀疏矩阵M
中,我希望M[row, col]
的值为{{data
中所有相应元素的总和。 1}}。通过阅读文档,coo_matrix
格式似乎是完美的,对于小例子,它可以正常工作。
我遇到的问题是当我扩展我的问题大小时,看起来中间列表data, row, col
正在耗尽我的所有(8gb)内存和交换空间,我的脚本会被自动杀死
所以我的问题是:
是否有适当的格式或有效的方法来逐步构建求和矩阵,因此我不必存储完整的中间列表/ numpy数组?
我的程序循环遍历网格,在每个点创建local_data, local_row, local_col
列表,然后将其元素附加到data, row, col
,以便能够根据稀疏矩阵使用列表更新稀疏矩阵构造函数将是理想的情况。
答案 0 :(得分:3)
有两件事可能会杀死你:数组上的重复项或列表的开销。在任何一种情况下,可能正确的做法是在将列表转储到coo_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
,然后将它们一起添加,大约需要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