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
numpy配列から-99の値を取り除くことの問題は、配列構造を保持する必要があることです。私は、rpy2がマスクされたnumpy配列ではうまく動作しないことに驚いています。おそらく、人々が頻繁に行う必要があるものではないでしょうか?とにかく、あなたの返事をありがとう。 – vulture
rpy2の開発者であることに気付かなかった。それを私たちに提供してくれてありがとう!私はパッチを提供する能力を持っていればいいと思う。上記のコードを回避策で更新しましたが、今のところ私が考え出すことができます。 – vulture
これはrpy2固有のものではありません。 Rはマスクされた配列を持たず、同等の概念は「マスクされた値」を「欠落」(Rの世界ではNA)に設定することです。 – lgautier