2017-12-17 21 views
1

保存された値が<であるかどうかに基づいて、配列に新しい値を代入しようとしています3. Rの背景から来ていますが、 Pythonでエラーが発生しました。私は間違って何をしていますか、Pythonのアプローチは何ですか?値を代入してPythonの配列を上書きする

eurx=[1,2,3,4,5,6,7,'a',8] 
sma50=3 

tw=eurx 
tw[eurx<sma50]=-1 
tw[eurx>=sma50]=1 
tw[(tw!=1)||(tw!=-1)]=0 
print(tw) 

GOAL:

-1 
-1 
1 
1 
1 
1 
1 
0 
1 
+1

配列されていないこと、それはリスト –

+0

である。また、これは、Pythonでコピーを作ることはありません意図: 'tw = eurx' –

答えて

1

これは、 "あまりにも多くのR" です。

>>> map(lambda i: -2*int(i<sma50)+1 if type(i) == int else 0, eurx) 
[-1, -1, 1, 1, 1, 1, 1, 0, 1] 

または数IFSとのforループだけのシンプル:一般的に

>>> for i in eurx: 
... if type(i) != int: 
...  print 0 
... else: 
...  print -2*int(i<sma50)+1 
... 
-1 
-1 
1 
1 
1 
1 
1 
0 
1 

:構文を推測しようとしない神託の方法は、機能的なフィルタリングを使用することです。それは非常に単純ですが、ちょうどいくつかのチュートリアルを読んで(例えばhttps://docs.python.org/3/tutorial/introduction.html#first-steps-towards-programming

編集:次のようにint変換ハックが動作します:あなたは右、intにブール値に変換することができます知っていますか?

>>> int(True) 
1 
>>> int(False) 
0 

i<sma50がTrueと評価された場合、int(i<sma50)isma50よりも小さく、それ以外の場合はゼロになる場合1.だから、ヨールの数字は、現在のものに変換されているだろう。しかし、明らかに(1, 0)の代わりに値(-1, 1)が必要です。変換-2x+1を適用するだけです。

+0

-2の理由を説明できますか?マップとラムダのためにグーグルグーグルに基づいて、それはどちらかの必要があるように見える – Rilcon42

+0

右、それは必須ではありません。 boolからintへの変換ハックがなければ、同じ結果を得るために別の 'if 'を挿入することができます。 – Pavel

+0

最初のコードは読み込みができません。ラムダで 'map'を使用すると、リスト内包を使うこともできます。 2番目の例では、何も返さない、または定義していないだけで、要素を出力します。 –

1

目的の構文は、numpyに書き込むものに非常に近いです。

異質リストは、それが簡単になりますが、ここでは一例ですいません:それはあなただった場合

>>> import numpy as np 
>>> eurx=[1,2,3,4,5,6,7,'a',8] 
>>> sma50 = 3 
>>> tw = np.array([i if isinstance(i, int) else np.nan for i in eurx]) 
>>> tw 
array([ 1., 2., 3., 4., 5., 6., 7., nan, 8.]) 
>>> tw[tw < sma50] = -1 
__main__:1: RuntimeWarning: invalid value encountered in less 
>>> tw[tw >= sma50] = 1 
__main__:1: RuntimeWarning: invalid value encountered in greater_equal 
>>> tw 
array([ -1., -1., 1., 1., 1., 1., 1., nan, 1.]) 
>>> tw[np.isnan(tw)] = 0 
>>> tw 
array([-1., -1., 1., 1., 1., 1., 1., 0., 1.]) 
関連する問題