Python 将遮罩numpy阵列与rpy2一起使用

Python 将遮罩numpy阵列与rpy2一起使用,python,r,numpy,rpy2,Python,R,Numpy,Rpy2,我是rpy2和numpy的新用户。我在RHEL5上使用R2.14.1、python 2.7.1、rpy2.2.5和numpy 1.5.1 我需要将数据读入numpy数组,并在其上使用rpy2函数。但是,在将数组与rpy2一起使用之前,我需要屏蔽缺少的值 我对屏蔽值没有问题,但我无法让rpy2处理生成的屏蔽数组。看起来numpy2ri转换在屏蔽numpy阵列上不起作用?(见下面的错误) 我怎样才能做到这一点?是否可以告诉rpy2忽略屏蔽值?我想坚持使用R,而不是直接使用scipy/numpy,因为

我是rpy2和numpy的新用户。我在RHEL5上使用R2.14.1、python 2.7.1、rpy2.2.5和numpy 1.5.1

我需要将数据读入numpy数组,并在其上使用rpy2函数。但是,在将数组与rpy2一起使用之前,我需要屏蔽缺少的值

我对屏蔽值没有问题,但我无法让rpy2处理生成的屏蔽数组。看起来numpy2ri转换在屏蔽numpy阵列上不起作用?(见下面的错误)

我怎样才能做到这一点?是否可以告诉rpy2忽略屏蔽值?我想坚持使用R,而不是直接使用scipy/numpy,因为我以后会做更多的高级统计

谢谢

import numpy
import rpy2
from rpy2 import robjects
import rpy2.robjects.numpy2ri

r = robjects.r
rpy2.robjects.numpy2ri.activate()

x = numpy.array( [1, 5, -99, 4, 5, 3, 7, -99, 6] )
mx = numpy.ma.masked_values( x, -99 )

print x         # works, displays all values
print r.sd(x)   # works, but uses -99 values in calculation

print mx        # works, now -99 values are masked (--)
print r.sd(mx)  # does not work - error
Traceback (most recent call last):
  File "d.py", line 16, in <module>
    print r.sd(mx)  # does not work - error
  File "/dev/py/lib/python2.7/site-packages/rpy2-2.2.5dev_20120227-py2.7-linux-x86_64.egg/rpy2/robjects/functions.py", line 82, in __call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
  File "/dev/py/lib/python2.7/site-packages/rpy2-2.2.5dev_20120227-py2.7-linux-x86_64.egg/rpy2/robjects/functions.py", line 30, in __call__
    new_args = [conversion.py2ri(a) for a in args]
  File "/dev/py/lib/python2.7/site-packages/rpy2-2.2.5dev_20120227-py2.7-linux-x86_64.egg/rpy2/robjects/numpy2ri.py", line 36, in numpy2ri
    vec = SexpVector(o.ravel("F"), _kinds[o.dtype.kind])
TypeError: ravel() takes exactly 1 argument (2 given)
“屏蔽值”(即耦合到要屏蔽的索引列表的值数组)的概念在R中并不直接存在

在R中,值要么设置为“缺失”(NA),要么获取原始数据结构的子集(因此创建一个仅包含该子集的新对象)


现在,在从numpy到rinterface的过程中,rpy2的幕后发生的事情是,将numpy数组复制到R数组中(反过来,将R数组暴露给numpy,不一定需要复制)。没有理由不在该阶段处理掩码(如果有人提供补丁,这可能会更快地到达代码库)。另一种方法是创建一个不带屏蔽值的numpy数组,然后将其提供给rpy2。

您可以加快用NaN替换-99值的过程 通过使用掩码数组,在numpy.ma中本机定义的对象

如以下代码所示:

# 'x' is a large numpy ndarray I am working with
# ('x' in the original code above was a small test array)

for i in range(900, 950):           # random slice of numpy ndarray
  for j in range(6225):             # full extent across slice
    if x[i][j] == -99:
      x[i][j] = numpy.NaN

y = x[933]                          # random piece of converted range
sd = r.sd( y, **{'na.rm': 'TRUE'} ) # r.sd() call that ignores numpy NaN values
print sd
x_masked是一个numpy.ma(掩码数组)。
x_filled是一个numpy.ndarray(常规numpy数组)

从numpy数组中剥离-99值的问题是我需要保留数组结构。我很惊讶rpy2不能与蒙面numpy阵列一起工作——也许这不是人们经常需要做的事情?无论如何,谢谢你的回复。我不知道你是rpy2的开发者。谢谢你提供给我们!我希望我有能力提供补丁。我在上面更新了我的代码,这是我目前能想到的最好的解决办法。这不是rpy2特有的东西。R没有屏蔽数组,等效的概念是将“屏蔽值”设置为“缺失”(R世界中的NA)。
x_masked = numpy.ma.masked_array(x, mask= (x==-99) )
x_filled = x_masked.filled( numpy.NaN )