A popular solution for scientific computing with Python is numpy (previous instances were Numpy and numarray).
rpy2 has features for facilitating the integration with code using numpy in both directions: from rpy2 to numpy, and from numpy to rpy2.
Vectors can be converted to numpy arrays using array() or asarray():
import numpy
ltr = robjects.r.letters
ltr_np = numpy.array(ltr)
This behavior is inherited from the low-level interface, and is means that the objects presents an interface recognized by numpy, and that interface used to know the structure of the object.
The conversion of numpy objects to rpy2 objects can be activated by importing the module numpy2ri:
import rpy2.robjects.numpy2ri
That import alone is sufficient to switch an automatic conversion of numpy objects into rpy2 objects.
Note
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.
Note
The module numpy2ri is an example of how custom conversion to and from rpy2.robjects can be performed.
The rpy2.rinterface.SexpVector objects are made to behave like arrays, as defined in the Python package numpy.
The functions numpy.array() and numpy.asarray() can be used construct numpy arrays:
>>> import numpy
>>> rx = rinterface.SexpVector([1,2,3,4], rinterface.INTSXP)
>>> nx = numpy.array(rx)
>>> nx_nc = numpy.asarray(rx)
Note
when using asarray(), the data are not copied.
>>> rx[2]
3
>>> nx_nc[2] = 42
>>> rx[2]
42
>>>