如何有效地洗牌 scipy 稀疏矩阵,无论其格式如何?

How to efficiently shuffle a scipy sparse matrix, whatever its format?

如何打乱 scipy 稀疏矩阵的行?

有一个 scikitlearn.utils.shuffle,但它 returns 是一个新矩阵,因此对于一个非常大的稀疏矩阵,改组不是就地完成的,而是复制矩阵。

numpy.random.Generator.shuffle, but it seems to work only for CSR matrices.

如何高效地打乱 scipy 稀疏矩阵的行,无论其在内存中使用何种格式存储?

我正在将我的评论合并为一个答案。这不是解决方案,但编辑更容易。

如果您希望找到一种不管稀疏格式如何都有效的行洗牌,那么您对稀疏矩阵文档的研究还不够。只有 csrlil 以面向行的方式存储它们的数据。

我可以想象使用 lil 格式进行就地行洗牌。虽然 csr 以面向行的方式存储数据,但行洗牌会更加复杂,并且难以就地进行。

追踪 scikit 洗牌,我看到它只是归结为 matrix[index,:](其中 index 是没有替换的采样)。这与 CSR link 中的相同。就其价值而言,CSR 索引实际上使用矩阵乘法,使用专门构造的 'extractor' 矩阵。

改组列表相对有效,无论就地与否,因为它只涉及为行列表创建一个新的 pointers/references 列表。密集 numpy 数组的行洗牌需要复制所有数据。它可以在编译代码中完成,但它仍然需要足够的缓冲区 space 来完成整个副本。