2010-03-15 59 views
24

轉換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轉換爲所需的數據類型?

回答

35

您需要添加

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

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

這僅僅導入足以 開關 numpy的的自動轉換對象到rpy2對象。

爲什麼使這是一個可選的進口, 雖然它可以 已列入功能py2ri()(如在提交該 功能 原來的補丁做)?

雖然兩者都是有效的,合理的 選項,設計決定是 爲了從numpy的 最脫鉤rpy2,不要以爲在安裝 numpy的自動 意味着程序員想用 它。

編輯: 隨着rpy2系列2.2.x的,單獨的進口不再是足夠的。轉換需要明確激活。

+0

我有點不確定如何「編輯@lgautier」中提到的「顯式激活」轉換。我遇到了一個類似的問題,在舊版本的rpy2中工作,但似乎在rpy2 2.2.2中損壞。你能提供一個簡單的例子嗎? – mishaF 2011-07-26 22:10:02

+0

對於將來的讀者:在導入後添加'rpy2.robjects.activate()'。他們在進口時遇到了副作用問題。 – agf 2011-07-26 23:30:17

+0

@agf:謝謝,agf。 – unutbu 2011-07-27 00:14:55

10

對於rpy2 2.2.4我不得不添加:

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