将Python对象转换为rpy2
下面的代码本来是想在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 个回答
2
对我来说(2.2.1版本),下面的内容也有效(具体可以参考这个链接):
import rpy2.robjects as ro
from rpy2.robjects.numpy2ri import numpy2ri
ro.conversion.py2ri = numpy2ri
11
对于 rpy2 2.2.4 版本,我需要添加:
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
48
你需要添加
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
想了解更多,可以查看 rpy2 的文档中的 numpy 部分(如果你用的是旧版 2.x,可以在 这里找到)
在 2.2.x 之前,仅仅导入就足够了。
仅仅这个导入就足以 自动将 numpy 对象转换为 rpy2 对象。
为什么要把这个导入变成可选的呢, 而不是直接放在 py2ri() 函数里(就像 原始补丁中那样)?
虽然这两种做法都是合理的选择, 但设计决定是为了尽量将 rpy2 和 numpy 解耦,不假设安装了 numpy 就一定意味着程序员想要使用它。