将Python对象转换为rpy2格式

33

以下代码旨在使用rpy2创建热图

import numpy as np
from rpy2.robjects import r
data = np.random.random((10,10))
r.heatmap(data)    

然而,它会导致以下错误

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.

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

3个回答

47
你需要添加

标签。

import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()

请参阅rpy2文档中的更多信息numpy部分这里是旧版2.x版本)。

在2.2.x之前,仅导入就足够了。

仅导入就足以将numpy对象自动转换为rpy2对象。

为什么要将其作为可选导入项, 而不是包含在函数py2ri()中(如原始补丁所提交的那样)?

虽然两种方法都是有效和合理的选择, 但设计决策是为了尽量将rpy2与numpy解耦, 并且不假设安装了numpy就意味着程序员想使用它。


我有些不确定如何“显式激活”转换,如@lgautier所述。我遇到了一个类似的问题,在rpy2的旧版本中工作良好,但在rpy2 2.2.2中似乎出现了问题。你能提供一个简短的例子吗? - mishaF
针对未来的读者: 在导入模块后添加 rpy2.robjects.activate() 代码。他们曾经遇到过导入模块会产生副作用的问题。 - agf

11

对于rpy2 2.2.4,我需要添加:

import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接