2012-02-29 8 views
1
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 

私はrpy2とnumpyの新しいユーザーです。 RHEL5では、R 2.14.1、Python 2.7.1、rpy2 2.2.5、numpy 1.5.1を使用しています。マスクされたnumpy配列をrpy2で使用

データをnumpy配列に読み込んでrpy2関数を使用する必要があります。しかし、rpy2で配列を使用する前に欠損値をマスクする必要があります。

値をマスキングするのに問題はありませんが、結果のマスクされた配列で動作するようrpy2を取得することはできません。マスクされたnumpy配列でnumpy2ri変換が機能しないようですか? (下のエラーを参照してください)

どうすればこの作品を作成できますか? rpy2にマスクされた値を無視させることは可能ですか?私は後でもっと高度な統計をやるので、scipy/numpyを直接使うのではなく、Rに固執したいと思います。

ありがとうございました。

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) 

更新:rpy2がマスクされたnumpyの配列を扱うことができないので、私はNaN値をnumpyのために私の-99の値を変換してみました。明らかに、rpy2は、RスタイルのNA値としてnumpyのNaN値を認識します。

r.sd()呼び出しでは、rpy2にNA値を使用しないように指示できるため、以下のコードは機能します。しかし、最初のNaN置換は、numpyマスクを適用するよりも明らかに遅いです。

あなたの誰かが大量のndarrayを介して-99からNaNへの置換を高速に実行できますか?あるいは別のアプローチを提案してもよいでしょうか?

ありがとうございました。

# '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 

答えて

2

「マスク値」(すなわち、マスクするインデックスのリストに結合された値のアレイである)の概念は、直接のいずれかに設定されているR値におけるR.

に存在しません(NA)、または元のデータ構造のサブセットが取得されます(このサブセットのみを含む新しいオブジェクトが作成されます)。

numpyからrinterfaceまでの間、rpy2のシーンの後ろで起こっているのは、numpyの配列をR配列にコピーしたことです(逆の方法で、R配列をnumpyにさらしても必ずしもコピーする必要はありません) 。マスクがその段階で処理されない理由はありません(これにより、誰かがパッチを提供している場合に、コードベースへのアクセスが速くなります)。代わりに、マスクされた値を持たないnumpy配列を作成し、これをrpy2に供給します。

+0

numpy配列から-99の値を取り除くことの問題は、配列構造を保持する必要があることです。私は、rpy2がマスクされたnumpy配列ではうまく動作しないことに驚いています。おそらく、人々が頻繁に行う必要があるものではないでしょうか?とにかく、あなたの返事をありがとう。 – vulture

+0

rpy2の開発者であることに気付かなかった。それを私たちに提供してくれてありがとう!私はパッチを提供する能力を持っていればいいと思う。上記のコードを回避策で更新しましたが、今のところ私が考え出すことができます。 – vulture

+0

これはrpy2固有のものではありません。 Rはマスクされた配列を持たず、同等の概念は「マスクされた値」を「欠落」(Rの世界ではNA)に設定することです。 – lgautier

1

あなたはネイティブnumpy.maで定義されているマスクされた配列、オブジェクトを使用してのNaN により-99の値を交換するプロセスをスピードアップすることができ、次のコードのよう

x_masked = numpy.ma.masked_array(x, mask= (x==-99)) 
x_filled = x_masked.filled(numpy.NaN) 

x_masked numpy.ma(マスクされた配列)です。 x_filledはnumpy.ndarray(通常のnumpy配列)

関連する問題