Conversión de objetos de Python para rpy2
Pregunta
Se supone que el siguiente código para crear un mapa de calor en rpy2
import numpy as np
from rpy2.robjects import r
data = np.random.random((10,10))
r.heatmap(data)
Sin embargo, el resultado es el siguiente error
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.
A partir de la documentación me entero de que r.heatmap espera "una matriz numérica". ¿Cómo convierto np.array al tipo de datos requerido?
Solución
Es necesario añadir
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
http://rpy.sourceforge.net/rpy2/doc -2.2 / html / numpy.html :
Eso importación solo es suficiente para cambiar una conversión automática de numpy objetos en objetos rpy2.
¿Por qué hacer esto una importación opcional, mientras que podría haber sido incluido en la py2ri función () (como se hace en el parche original presentada a tal función)?
A pesar de que ambos son válidos y razonables opciones, se tomó la decisión de diseño con el fin de desacoplar rpy2 de numpy la mayoría, y no asuma que habiendo numpy instala automáticamente significaba que un programador quería utilizar a él.
editar Con la serie 2.2.x rpy2, la importación sola ya no es suficiente. La conversión necesita ser activado de forma explícita.
Otros consejos
Para rpy2 2.2.4 he tenido que añadir:
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Para mí (2.2.1) lo siguiente también trabajó (como se documenta en la 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