【问题标题】:TypeError: unsupported operand type(s) for -: 'float' and 'FloatVector'TypeError: 不支持的操作数类型 -: 'float' 和 'FloatVector'
【发布时间】:2016-10-31 17:18:05
【问题描述】:

我是 Python 新手,甚至是 rpy2 的新手,它允许我通过 Python 使用 R。

我尝试从 rpy2 导入 r:

    from rpy2.robjects import r

这似乎有效,我继续编写我的代码,在某些时候它包含类似于:

    pval=1.0-r.phyper(integerA, integerB, integerC, integerD)

这给出了以下错误:

    TypeError: unsupported operand type(s) for -: 'float' and 'FloatVector'

这是什么意思,我该如何改变它?

提前致谢!

【问题讨论】:

  • 这意味着你不能从一个数字中减去一个向量(即一个有序的数字集合)。

标签: python r rpy2


【解决方案1】:

结果

r.phyper(integerA, integerB, integerC, integerD)

是浮点数的 R 向量(因此是 rpy2 对象FloatVector)。运行可能会看得更清楚:

print(r.phyper(integerA, integerB, integerC, integerD))

现在,如果您想应用 R 向量化运算符(此处 "-" 应用于向量中的所有元素),最简单的方法之一是为两个操作数使用 R 向量并使用“R 运算符”访问器 @987654327 @:

from rpy2.robjects.vectors import FloatVector
p = FloatVector((.6, .7, .99))

pval= FloatVector([1.0])).ro - p

其中一种选择是按照通常对 Python 序列进行元素操作的方式进行:

pval = [1.0 - x for x in p]

【讨论】:

  • 非常感谢。这已经澄清了很多。但是,我认为 phyper 只会给我一个“p 值”或“机会”,而我原本以为这是一个数字。
  • 当我应用上述内容时,我猜我将我的数字 1.0 变成了 FloatVector?这是什么意思(例如,我的“1.0”通过这样做会变成什么)? FloatVector 函数的含义是什么(我google了,但找不到明确的解释)?以及如何从两个 FloatVector 中减去一个 p 值?
  • @Myrtille “这样做我的 '1.0' 会变成什么”:1.0 不再是一个标量(即“只是一个数字”),而是一个序列(特别是一个 R 向量)。不幸的是,readthedocs 上的文档是不完整的,因为文档字符串没有从 Python 对象中正确提取。这里有一点(rpy2.readthedocs.io/en/version_2.8.x/…),文档字符串在源代码中(bitbucket.org/rpy2/rpy2/src/…
【解决方案2】:

我认为我让它的工作方式与 Igautier 建议的类似,但我没有将我的 1.0 也变成 FloatVector,而是将 FloatVector 变成了浮点数,因为 FloatVector 似乎只包含 1 个元素:

    p = r.phyper(intA, intB, intC, intD)
    p = float(p[0])
    pval = 1.0 - p

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 2018-10-30
    • 2014-03-28
    • 2018-06-20
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多