Conversion d'objets en python pour rpy2
Question
Le code suivant est censé créer un heatmap dans 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 que j'apprends que r.heatmap attend « une matrice numérique ». Comment puis-je convertir np.array au type de données requises?
La solution
Vous devez ajouter
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Voir http://rpy.sourceforge.net/rpy2/doc -2,2 / html / numpy.html :
Cette importation seule est suffisante pour commuter une conversion automatique de numpy objets 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 vérification fonction)?
Bien que les deux sont valables 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 après avoir installé automatiquement numpy signifie qu'un programmeur voulait utiliser il.
modifier Avec la 2.2.x série rpy2, l'importation seule ne suffit plus. La conversion doit être explicitement activée.
Autres conseils
Pour rpy2 2.2.4 je devais ajouter:
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Pour moi (2.2.1) ci-après ont aussi travaillé (comme indiqué sur http://rpy.sourceforge.net/rpy2/doc-2.2/html/numpy.html ):
import rpy2.robjects as ro
from rpy2.robjects.numpy2ri import numpy2ri
ro.conversion.py2ri = numpy2ri