Konvertieren von Python-Objekte für rpy2
Frage
Der folgende Code sollte eine Heatmap in rpy2 erstellen
import numpy as np
from rpy2.robjects import r
data = np.random.random((10,10))
r.heatmap(data)
Allerdings führt es in dem folgenden Fehler
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.
Aus der Dokumentation erfahre ich, dass r.heatmap erwartet „eine numerische Matrix“. Wie kann ich np.array auf den gewünschten Datentyp umwandeln?
Lösung
Sie müssen hinzufügen
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Siehe http://rpy.sourceforge.net/rpy2/doc -2.2 / html / numpy.html :
Das Import allein reicht aus, um Schalter eine automatische Umwandlung von numpy Objekte in rpy2 Objekte.
Warum dies ein optionales Import machen, während es aufgenommen worden sein könnte in die Funktion py2ri () (wie in der getan Original-Patch für die eingereicht Funktion)?
Obwohl beide gültig sind und angemessen Optionen wurden die Design-Entscheidung getroffen um zu entkoppeln rpy2 von numpy die meisten, und nicht davon ausgehen, dass numpy nachdem automatisch installiert bedeuten, dass ein Programmierer verwenden wollte es.
Bearbeiten Mit der rpy2 Serie 2.2.x, ist der Import allein nicht mehr aus. Die Umwandlung Bedürfnisse explizit aktiviert werden.
Andere Tipps
Für rpy2 2.2.4 musste ich hinzufügen:
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Für mich (2.2.1) die folgenden auch gearbeitet (wie dokumentiert auf 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