33

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:\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.

From the documentation I learn that r.heatmap expects "a numeric matrix". How do I convert np.array to the required data type?

Boris Gorelik
  • 29,945
  • 39
  • 128
  • 170

3 Answers3

47

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.

krassowski
  • 13,598
  • 4
  • 60
  • 92
unutbu
  • 842,883
  • 184
  • 1,785
  • 1,677
  • I'm a bit unsure of how to "explicitly activate" the conversion as mentioned in the edit @lgautier. I am encountering a similar problem that worked in an older version of rpy2 but seems broken in rpy2 2.2.2. Can you provide a brief example? – mishaF Jul 26 '11 at 22:10
  • For future readers: add `rpy2.robjects.activate()` after the import. They had problems with the import having side-effects. – agf Jul 26 '11 at 23:30
11

For rpy2 2.2.4 I had to add:

import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
brink
  • 111
  • 1
  • 3
2

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
flinz
  • 347
  • 4
  • 12