scipy 在稀疏设计矩阵上用rpy 2运行glmnet?

mbyulnm0  于 2024-01-09  发布在  其他
关注(0)|答案(4)|浏览(204)

我有一个python代码片段,它可以很好地在np.array X和y上运行GLMNET。然而,当X是scipy中的列稀疏矩阵时,代码失败,因为rpy2无法转换X。我犯了一个明显的错误吗?
MCVE是:

  1. import numpy as np
  2. from scipy import sparse
  3. from rpy2 import robjects
  4. import rpy2.robjects.packages as rpackages
  5. from rpy2.robjects import numpy2ri
  6. from rpy2.robjects import pandas2ri
  7. if __name__ == "__main__":
  8. X = sparse.rand(5, 20, density=0.1)
  9. y = np.random.randn(5)
  10. numpy2ri.activate()
  11. pandas2ri.activate()
  12. utils = rpackages.importr('utils')
  13. utils.chooseCRANmirror(ind=1)
  14. if not rpackages.isinstalled('glmnet'):
  15. utils.install_packages("glmnet")
  16. glmnet = rpackages.importr('glmnet')
  17. glmnet = robjects.r['glmnet']
  18. glmnet_fit = glmnet(X, y, intercept=False, standardize=False)

字符串
当我运行它时,我得到一个NotImplementedError

  1. Conversion 'py2ri' not defined for objects of type '<class 'scipy.sparse.csc.csc_matrix'>'


我可以用不同的方式提供X吗?如果rpy 2不能处理稀疏矩阵,我会感到惊讶。

q3qa4bjr

q3qa4bjr1#

你可以用rpy 2创建一个稀疏矩阵,如下所示:

  1. import numpy as np
  2. import rpy2.robjects as ro
  3. from rpy2.robjects.packages import importr
  4. from scipy import sparse
  5. X = sparse.rand(5, 20, density=0.1).tocoo()
  6. r_Matrix = importr("Matrix")
  7. r_Matrix.sparseMatrix(
  8. i=ro.IntVector(X.row + 1),
  9. j=ro.IntVector(X.col + 1),
  10. x=ro.FloatVector(X.data),
  11. dims=ro.IntVector(X.shape))

字符串

ukqbszuj

ukqbszuj2#

rpy 2中确实没有包含用于您的对象类型的转换器Python -> R。您的Python对象不是传统的数组,而是您注意到的稀疏矩阵(具体为scipy.sparse.csc.csc_matrix),作为numpy可用的数字扩展之一实现。由于numpy本身甚至不需要使用rpy2,因此对numpy扩展的支持相当稀疏,但pandas是一个明显的例外,因为数据表无处不在。
您可能希望在R软件包Matrixhttps://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/dgCMatrix-class.html)中编写自己的从css_matrixgcCMatrix的转换器,因为软件包glmnet似乎能够处理它们。
编写一个自定义转换器需要如何将Python对象的内容Map或复制到它所选择的R对应对象,但是一旦完成,将代码插入rpy 2应该很容易:https://rpy2.github.io/doc/v2.9.x/html/generated_rst/s4class.html#custom-conversion
考虑在rpy 2问题跟踪器上将一个问题作为“特性请求”打开,并报告进度和结果,希望看到这变成一个完整的单元测试拉取请求。

cigdeys3

cigdeys33#

另外,一个可能有效的快速解决方案是临时保存稀疏矩阵文件。

  1. import numpy as np
  2. import rpy2.robjects as ro
  3. import warnings
  4. from rpy2.rinterface import RRuntimeWarning
  5. import rpy2.robjects.numpy2ri as numpy2ri
  6. from scipy.io import mmwrite
  7. mmwrite('temp.mtx',matrix)
  8. ro.r('X <- readMM("temp.mtx")')

字符串
我会很感兴趣,虽然,如果有人来了一个自定义转换器,以避免复制到磁盘。

fae0ux8s

fae0ux8s4#

python包anndata2ri具有将scipy稀疏矩阵转换为R的函数,反之亦然。

  1. import anndata2ri
  2. anndata2ri.activate()
  3. r_sparse_mat = anndata2ri.scipy2ri.py2rpy(py_sparse_mat)

字符串

相关问题