The following code is supposed to create a heatmap in rpy2
import numpy as np from rpy2.robjects import r data = np.random.random((10,10)) r.heatmap(data)
However, it results in the following error
Traceback (most recent call last):
File "z.py", line 8, in <module>
labRow=rowNames, labCol=colNames)
File "C:Python25libsite-packagesrpy2robjects__init__.py", line 418, in __call__
new_args = [conversion.py2ri(a) for a in args]
File "C:Python25libsite-packagesrpy2robjects__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.
From the documentation I learn that r.heatmap expects “a numeric matrix”. How do I convert np.array to the required data type?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
You need to add
import rpy2.robjects.numpy2ri rpy2.robjects.numpy2ri.activate()
See more in rpy2 documentation numpy section (here for the older 2.x version)
Prior to 2.2.x the import alone was sufficient.
That import alone is sufficient to
switch an automatic conversion of
numpy objects into rpy2 objects.Why make this an optional import,
while it could have been included in
the function py2ri() (as done in the
original patch submitted for that
function) ?Although both are valid and reasonable
options, the design decision was taken
in order to decouple rpy2 from numpy
the most, and do not assume that
having numpy installed automatically
meant that a programmer wanted to use
it.
Method 2
For rpy2 2.2.4 I had to add:
import rpy2.robjects.numpy2ri rpy2.robjects.numpy2ri.activate()
Method 3
For me (2.2.1) the following also worked (as documented on 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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0