为rpy2转换python对象

Bor*_*lik 26 python r rpy2

以下代码应该在rpy2中创建热图

import numpy as np
from rpy2.robjects import r
data = np.random.random((10,10))
r.heatmap(data)    
Run Code Online (Sandbox Code Playgroud)

但是,它会导致以下错误

Traceback (most recent call last):
  File "z.py", line 8, in <module>
    labRow=rowNames, labCol=colNames)
  File "C:\Python25\lib\site-packages\rpy2\robjects\__init__.py", line 418, in __call__
    new_args = [conversion.py2ri(a) for a in args]
  File "C:\Python25\lib\site-packages\rpy2\robjects\__init__.py", line 93, in default_py2ri
    raise(ValueError("Nothing can be done for the type %s at the moment." %(type(o))))
ValueError: Nothing can be done for the type <type 'numpy.ndarray'> at the moment.
Run Code Online (Sandbox Code Playgroud)

从文档中我了解到r.heatmap需要"一个数字矩阵".如何将np.array转换为所需的数据类型?

unu*_*tbu 38

你需要添加

import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Run Code Online (Sandbox Code Playgroud)

http://rpy.sourceforge.net/rpy2/doc-2.2/html/numpy.html:

单独导入就足以将numpy对象的自动转换切换为rpy2对象.

为什么将它作为可选导入,虽然它可以包含在函数py2ri()中(如在为该函数提交的原始补丁中所做的那样)?

尽管两者都是有效且合理的选项,但是设计决策是为了将rpy2与numpy分离得最多,并且不要假设自动安装numpy意味着程序员想要使用它.

编辑: 使用rpy2系列2.2.x,单独导入已经不够了.需要明确激活转换.


小智 10

对于rpy2 2.2.4我必须添加:

import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Run Code Online (Sandbox Code Playgroud)