it is clear to me how to convert a float / double R-matrix into a numpy array, but I get an error if the matrix is complex.
Example:
import numpy as np
import rpy2.robjects as robjects
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
m1=robjects.IntVector(range(10))
m2 = robjects.r.matrix(robjects.r['as.complex'](m1), nrow=5)
tmp=np.array(m2, dtype=complex) #ValueError: invalid __array_struct__
The problem persists with the following line of code:
tmp=np.array(m2)
All works fine if the matrix is not complex:
m2 = robjects.r.matrix(m1, nrow=5)
tmp=np.array(m2)
Thanks for any help!
PS: Note that the following dirty trick solves the problem, but does not really answer the question:
tmp=np.array(robjects.r.Re(m2))+1j*np.array(robjects.r.Im(m2))
PS2: it seems that nobody can answer this question, should we conclude there is a bug in rpy2?
Sometimes it can become tricky to convert rpy objects to numpy, but it is much more reliable to convert them to python objects (list, tuple etc) first and construct an array later. A solution :
In [33]:
import numpy as np
import rpy2.robjects as robjects
robjects.reval('m1 <- c(1:10)')
robjects.reval("m2 <- matrix(as.complex(m1), nrow=5)")
np.array(list(robjects.r.m2)).reshape(robjects.r.m2.dim)
Out[33]:
array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j],
[ 5.+0.j, 6.+0.j],
[ 7.+0.j, 8.+0.j],
[ 9.+0.j, 10.+0.j]])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With