2010-03-15 11 views
24

El siguiente código se supone que crear un mapa de calor en rpy2convertir objetos de Python para 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. 

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?

Respuesta

35

es necesario agregar

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

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

que importan por sí solo es suficiente para interruptor de 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 hizo en el parche original presentado para esa función )?

Aunque ambos son válidos y razonables opciones, la decisión de diseño fue tomada con el fin de desacoplar rpy2 de numpy la mayoría, y no asuma que haber instalado numpy automáticamente significaba que un programador quería utilizar se .

edición: Con la serie 2.2.x rpy2, la importación sola ya no es suficiente. La conversión debe estar explícitamente activada.

+0

estoy un poco no está seguro de cómo "activar explícitamente" la conversión como se menciona en edit @lgautier. Me encuentro con un problema similar que funcionaba en una versión anterior de rpy2 pero parece estar roto en rpy2 2.2.2. ¿Puedes dar un breve ejemplo? – mishaF

+0

Para futuros lectores: agregue 'rpy2.robjects.activate()' después de la importación. Tuvieron problemas con la importación con efectos secundarios. – agf

+0

@agf: Gracias, agf. – unutbu

10

Para rpy2 2.2.4 he tenido que añadir:

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