Numpy

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.

High-level interface

From rpy2 to numpy:

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.

From numpy to rpy2:

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.

Low-level interface

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
>>>

Table Of Contents

Previous topic

High-level interface

Next topic

Mapping rpy2 objects to arbitrary python objects

This Page