我有一个python代码片段,可以在np.array
X和y上运行GLMNET。但是,当X是scipy的列稀疏矩阵时,代码失败,因为rpy2无法转换X。我犯了明显的错误吗?在
MCVE是:
import numpy as np
from scipy import sparse
from rpy2 import robjects
import rpy2.robjects.packages as rpackages
from rpy2.robjects import numpy2ri
from rpy2.robjects import pandas2ri
if __name__ == "__main__":
X = sparse.rand(5, 20, density=0.1)
y = np.random.randn(5)
numpy2ri.activate()
pandas2ri.activate()
utils = rpackages.importr('utils')
utils.chooseCRANmirror(ind=1)
if not rpackages.isinstalled('glmnet'):
utils.install_packages("glmnet")
glmnet = rpackages.importr('glmnet')
glmnet = robjects.r['glmnet']
glmnet_fit = glmnet(X, y, intercept=False, standardize=False)
当我运行它时,我得到一个NotImplementedError
:
我可以用不同的方式提供X吗?如果rpy2不能处理稀疏矩阵,我会很惊讶。在
对于rpy2中包含的对象类型,确实没有Python->;R转换器。您的Python对象不是传统的数组,而是一个稀疏矩阵(具体来说,
scipy.sparse.csc.csc_matrix
),实现为numpy可用的数值扩展之一。由于numpy
本身甚至不需要使用rpy2
,因此对numpy扩展的支持相当少,pandas
是一个显著的例外,因为数据表无处不在。在您可能希望在R包}的转换器,因为包
Matrix
(https://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/dgCMatrix-class.html)中编写自己的从css_matrix
到{glmnet
似乎能够处理它们。在编写一个定制的转换器需要如何将Python对象的内容映射或复制到它选择的R对应对象,但是一旦完成,将代码插入rpy2应该非常容易: https://rpy2.github.io/doc/v2.9.x/html/generated_rst/s4class.html#custom-conversion
考虑在rpy2问题跟踪器上以“特性请求”的形式打开一个问题,并报告进度和结果,希望看到这变成一个包含单元测试的请求
另外一个可能有效的快速解决方案是暂时保存稀疏矩阵文件。在
不过,如果有人提供了一个自定义转换器来避免拷贝到磁盘,我会非常感兴趣的。在
可以使用rpy2创建稀疏矩阵,如下所示:
相关问题 更多 >
编程相关推荐