Преобразование объектов python для rpy2
Вопрос
Предполагается, что следующий код создаст тепловую карту в 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 в требуемый тип данных?
Решение
Вам нужно добавить
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 одного импорта уже недостаточно.Преобразование должно быть явно активировано.
Другие советы
Для rpy2 2.2.4 мне пришлось добавить:
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
Для меня (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