我很清楚如何将浮点/双R矩阵转换为numpy数组,但如果矩阵很复杂,我会得到一个错误。
例子:
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__
以下代码行仍然存在问题:
tmp=np.array(m2)
如果矩阵不复杂,则一切正常:
m2 = robjects.r.matrix(m1, nrow=5)
tmp=np.array(m2)
谢谢你的帮助!
注:请注意,下面的肮脏伎俩解决了问题,但并没有真正回答问题:
tmp=np.array(robjects.r.Re(m2))+1j*np.array(robjects.r.Im(m2))
PS2:似乎没有人能回答这个问题,我们是否应该断定rpy2中存在一个bug?
最佳答案
有时将rpy
对象转换为numpy
对象会变得很棘手,但首先将它们转换为python
对象(list
,tuple
等)然后再构造array
对象要可靠得多。解决方案:
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]])