Преобразование объектов Python для rpy2 - PullRequest
26 голосов
/ 15 марта 2010

Следующий код должен создать тепловую карту в rpy2

import numpy as np
from rpy2.robjects import r
data = np.random.random((10,10))
r.heatmap(data)    

Однако это приводит к следующей ошибке

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.

Из документации я узнаю, что r.heatmap ожидает "числовую матрицу". Как преобразовать np.array в нужный тип данных?

Ответы [ 3 ]

37 голосов
/ 15 марта 2010

Вам нужно добавить

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

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

Одного этого импорта достаточно для включить автоматическое преобразование numpy объекты в объекты rpy2.

Зачем делать этот дополнительный импорт, в то время как это могло быть включено в функция py2ri () (как сделано в оригинальный патч, представленный для этого функция)?

Хотя оба они действительны и разумны варианты, дизайнерское решение было принято для того, чтобы отделить rpy2 от NumPy самое, и не предполагайте, что автоматически установив numpy означало, что программист хотел использовать это.

редактирование: В серии rpy2 2.2.x одного импорта уже недостаточно. Преобразование должно быть явно активировано.

10 голосов
/ 24 ноября 2011

Для rpy2 2.2.4 мне пришлось добавить:

import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
1 голос
/ 04 июня 2012

Для меня (2.2.1) следующее также сработало (как описано в 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
...