如何在rpy2中创建两列矩阵

2024-09-28 01:32:34 发布

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

我正在使用rpy2从R库运行一个方法。根据文件:

method_name(x, range.x)

x: a two-column numeric matrix.
range.x: a list containing two vectors.

其中包括一个例子:

data(geyser, package="MASS")
x <- cbind(geyser$duration, geyser$waiting)
est <- method_name(x, range.x)

我检查了geyser$durationgeyser$waiting的类型,它们都是double。我还尝试用R中的{}和{}替换{}和{},代码仍然有效

在我当前的Python代码中,我有:

import numpy as np
import rpy2.robjects as robjects
import rpy2.robjects.packages as rpackages
from rpy2.robjects.vectors import StrVector, FloatVector, ListVector # I tried these before too
from rpy2.robjects import numpy2ri, pandas2ri

numpy2ri.activate()
pandas2ri.activate()

base = rpackages.importr(('base'))

a = np.array([1.2, 2.1, 2.5]); b = np.array([5.2, 1.3, 2.15])
x = base.cbind(base.c(a), base.c(b))

ranges = base.range(x)
result = method_name(x, ranges)

如您所见,我正试图使我的代码尽可能类似于示例。然而,我无法使这种方法起作用。我得到了错误Error in seq.default(a[2L], b[2L], length = M[2L]),这可能与参数中的问题有关

ranges有一个明显的问题,因为它只包含两个值,x的最小值和最大值,但是,它应该包含两个最小值和最大值(矩阵的每列一对)。我可以这样做:

ranges = base.cbind(base.range(a), base.range(b))

但这意味着我创建矩阵的方式存在问题。否则,我只需使用base.range(x)就可以得到两对值

我也试过x = robjects.r.matrix(x, ncol = 2),但没有成功。调用range时,我仍然只得到整个矩阵的全局最小值和最大值

创建此矩阵以便该方法可以运行的正确方法是什么


Tags: 方法代码nameimportbaseasnprange
1条回答
网友
1楼 · 发布于 2024-09-28 01:32:34

根据range函数的文档,它接受作为输入向量的(一维数组)。因此,它可以通过将其应用于矩阵的每一列或首先直接应用于ab元素来工作,正如您所提到的。因此,第二种方法应该有效

# Define a,b vectors
a = np.array([1.2, 2.1, 2.5]); b = np.array([5.2, 1.3, 2.15])

# Calculate vector ranges
range_a = base.range(base.c(a))
range_b = base.range(base.c(b))

# Define the matrix 
x = base.cbind(base.c(a), base.c(b))
print(x)
>>> [[1.2  5.2 ]
    [2.1  1.3 ]
    [2.5  2.15]]

# Define the ranges
ranges = base.cbind(range_a, range_b)
print(ranges)
>>> [[1.2 1.3]
    [2.5 5.2]]

相关问题 更多 >

    热门问题