2010-03-15 6 views
24

Le code suivant est censé créer un heatmap dans rpy2Conversion d'objets python pour rpy2

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

Cependant, il en résulte l'erreur suivante

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. 

De la documentation J'apprends que r.heatmap attend "une matrice numérique". Comment puis-je convertir np.array au type de données requis?

Répondre

35

Vous devez ajouter

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

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

qui importent seul suffit pour faire passer une conversion automatique des objets numpy en objets rpy2.

Pourquoi en faire une importation en option, alors qu'il aurait pu être inclus dans la fonction py2ri() (comme cela se fait dans le patch d'origine soumis à cette fonction )?

Bien que les deux sont valides et raisonnables options, la décision de conception a été prise pour découpler rpy2 de numpy le plus, et ne présumez pas que ayant numpy installé automatiquement signifie qu'un programmeur voulait utiliser il .

modifier: Avec la 2.2.x série rpy2, l'importation seul ne suffit plus. La conversion doit être explicitement activée.

+0

Je suis un peu ne savez pas comment "activer explicitement" la conversion comme mentionné dans le edit @lgautier. Je rencontre un problème similaire qui a fonctionné dans une ancienne version de rpy2 mais qui semble cassé dans rpy2 2.2.2. Pouvez-vous donner un bref exemple? – mishaF

+0

Pour les futurs lecteurs: ajoutez 'rpy2.robjects.activate()' après l'importation. Ils ont eu des problèmes avec l'importation ayant des effets secondaires. – agf

+0

@agf: Merci, agf. – unutbu

10

Pour rpy2 2.2.4 J'ai dû ajouter:

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