Conversione oggetti Python per rpy2
Domanda
Il seguente codice dovrebbe creare una mappa termica in rpy2
import numpy as np
from rpy2.robjects import r
data = np.random.random((10,10))
r.heatmap(data)
Tuttavia, il risultato e 'il seguente errore
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.
Dalla documentazione apprendo che r.heatmap si aspetta "una matrice numerica". Come faccio a convertire np.array al tipo di dati richiesti?
Soluzione
È necessario aggiungere
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
http://rpy.sourceforge.net/rpy2/doc -2.2 / html / numpy.html :
Quello di importazione da sola è sufficiente per attivare una conversione automatica di NumPy oggetti in oggetti rpy2.
Perché fare questo un'importazione facoltativa, mentre avrebbe potuto essere incluso nel la funzione py2ri () (come fatto in patch originale presentato per quello funzione)?
Anche se entrambi sono valide e ragionevoli opzioni, la decisione di progettazione è stata presa per disaccoppiare rpy2 da numpy di più, e non date per scontato che avendo numpy installato automaticamente ha fatto sì che un programmatore voleva usare esso.
modifica Con la serie rpy2 2.2.x, l'importazione da sola non è più sufficiente. La conversione deve essere esplicitamente attivata.
Altri suggerimenti
Per rpy2 2.2.4 ho dovuto aggiungere:
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Per me (2.2.1) seguito anche lavorato (come documentato su 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