是否存在稀疏矩阵/对象的`data.table`表示?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否存在稀疏矩阵/对象的`data.table`表示?相关的知识,希望对你有一定的参考价值。

我想在data.table框架中工作,原因有很多,不包含在这篇文章中。 data.table是否有指标矩阵的稀疏表示,Matrix包?

library(Matrix)
library(data.table)

set.seed(123409L)

ints <- sample.int(2L, 1e6, replace=T, prob= c(0.9, 0.1)) - 1

m <- Matrix(ints, ncol= 1000)
dt <- data.table(matrix(ints, ncol= 1000))

pryr::object_size(m) # 1.22 MB
pryr::object_size(dt) # 8.1 MB

假设在实际使用案例中,我更接近于6e8元素,其中增长是假设无限的。

如果这个问题已经得到解答,请提前道歉。我很高兴它被标记为重复;但我没有通过搜索找到重复。

答案

正如@Frank在他的评论中所建议的那样,你可以通过将非零元素及其索引存储为单独的观察结果,即三元组形式,在data.table中有效地表示稀疏矩阵:

m2 <- as(m, "dgTMatrix")
dt2 <- data.table(i=m2@i+1, j=m2@j+1, value=m2@x)

pryr::object_size(dt2) # 1.62 MB

这个data.table也可以从dt构建:

dt2 <- melt(copy(dt)[,i:=.I], id.vars="i"
    )[value>0][,j:=as.integer(variable)][,variable:=NULL]

以上是关于是否存在稀疏矩阵/对象的`data.table`表示?的主要内容,如果未能解决你的问题,请参考以下文章

Python中的稀疏3d矩阵/数组?

看数据结构写代码(21) 稀疏矩阵(十字链表方式)

哪个稀疏矩阵表示与 sklearn.svm.LinearSVC 一起使用

关于稀疏矩阵三元组的转置

犰狳中是不是有类似稀疏立方体的东西,或者使用稀疏矩阵作为立方体中的切片的某种方式?

稀疏矩阵定义以及存储格式(COO,CSR,CSC)