如何对scipy稀疏矩阵的行进行混洗?
有一个scikitlearn.utils.shuffle,但它返回一个新的矩阵,因此对于非常大的稀疏矩阵,混洗不是就地完成的,而是复制矩阵。
有numpy.random.Generator.shuffle,但它似乎是work only for CSR matrices。
如何有效地打乱scipy稀疏矩阵的行数,不管它是以什么格式存储在内存中的?
发布于 2020-12-02 03:35:45
我正在将我的评论合并到一个答案中。这不是一种解决方案,但编辑起来更容易。
如果您希望找到一种有效的行随机排列,而不考虑稀疏格式,那么您还没有充分研究稀疏矩阵文档。只有csr和lil以面向行的方式存储数据。
我可以想象使用lil格式就地进行行混洗的情形。虽然csr以面向行的方式存储数据,但行洗牌将更加复杂,并且难以就地执行。
通过scikit混洗,我看到它只是归结到matrix[index,:] (其中index是一个没有替换的采样)。这与CSR链接中的相同。无论如何,CSR索引实际上使用了矩阵乘法,使用了一个特殊构造的‘提取器’矩阵。
混洗列表是相对有效的,不管是不是就地,因为它只需要创建一个指向行列表的指针/引用的新列表。密集numpy数组的行洗牌需要复制所有数据。它可以在编译后的代码中完成,但它仍然需要足够的缓冲区空间来进行整个复制。
https://stackoverflow.com/questions/65095593
复制相似问题