在中使用rpy2低电平将numpy转换为R数组

2024-07-03 08:03:12 发布

您现在位置:Python中文网/ 问答频道 /正文

关于SO有很多相关的答案,但是它们都使用了^{}提供的高级robjects接口。但是,如果我想使用底层接口,我该怎么做呢?下面是一个MCVE(如果您在R中安装了package ^{}):

备选方案1,只使用底层接口,如the docs

import numpy as np
from rpy2 import rinterface as ri

ri.initr()

def rimport(packname):
    as_environment = ri.baseenv['as.environment']
    require = ri.baseenv['require']
    require(ri.StrSexpVector([packname]),
            quiet = ri.BoolSexpVector((True, )))
    packname = ri.StrSexpVector(['package:' + str(packname)])
    pack_env = as_environment(packname)
    return pack_env

Copula = rimport('copula')

# The ri.SexpVector line causes the problem, but this is how the docs has it.
gc = Copula['gofCopula'](copula=Copula['gumbelCopula'](dim=5),
                         x=ri.SexpVector(np.random.randn(100,5), ri.REALSXP),
                         N=ri.IntSexpVector((1000,)),
                         simulation=ri.StrSexpVector(('mult',)))
死亡原因: ^{pr2}$

备选方案2,使用numpy2ri,如所有关于SO

的答案所示
import numpy as np
from rpy2 import rinterface as ri
from rpy2.robjects import numpy2ri

ri.initr()
numpy2ri.activate()

def rimport(packname):
    as_environment = ri.baseenv['as.environment']
    require = ri.baseenv['require']
    require(ri.StrSexpVector([packname]),
            quiet = ri.BoolSexpVector((True, )))
    packname = ri.StrSexpVector(['package:' + str(packname)])
    pack_env = as_environment(packname)
    return pack_env

Copula = rimport('copula')

# Automatic conversion does not happen!
gc = Copula['gofCopula'](copula=Copula['gumbelCopula'](dim=5),
                         x=np.random.randn(100,5), # Hoping for automatic conversion
                         N=ri.IntSexpVector((1000,)),
                         simulation=ri.StrSexpVector(('mult',)))
死亡原因:
ValueError                                Traceback (most recent call last)
<ipython-input-1-17b2b5105f01> in <module>()
     24                          x=np.random.randn(100,5),
     25                          N=ri.IntSexpVector((1000,)),
---> 26                          simulation=ri.StrSexpVector(('mult',)))
     27 
     28 gc

ValueError: All parameters must be of type Sexp_Type,or Python int/long, float, bool, or None

备选方案3,同时使用

就像备选方案1一样死去。在


附加说明

1)

list(ri.SexpVector(np.random.randn(100,5), ri.REALSXP))

是一个包含NA_real_,正好100个的列表。在

2)

如果我抛弃了低级接口,只使用高级接口,一切都会正常工作。但这不是我要找的。在

import numpy as np
from rpy2.robjects.packages import importr
from rpy2.robjects import numpy2ri

numpy2ri.activate()

Copula = importr('copula')
gc = Copula.gofCopula(copula=partial(Copula.gumbelCopula, dim=5)(),
                      x=np.random.randn(100,5),
                      N=1000,
                      simulation='mult')

Tags: fromimportenvironmentasnprandomrequirecopula
1条回答
网友
1楼 · 发布于 2024-07-03 08:03:12

感谢您对高级界面和所做的工作的赞扬,尽管这是一种含蓄的评价:它确实是为了“工作”而设计的。在

这个底层接口非常接近R的C级API,它的使用可能需要更多的关于它的知识,而这些知识对于Python用户来说是合理的。请注意,由于未包含docstring(issue with readthedocs),发布的文档并不完整。在

我鼓励您使用高级接口,除非有特定的原因不使用,但是由于源代码是开放的,所以可以很容易地检查转换器中发生的事情(它是here)。在

相关问题 更多 >