2016-06-27 4 views
1

Pythonの配列の中括弧の中にif-else文を使って値を代入するのが良い方法があるのだろうかと思います。私が欲しいのは次のようなものです:Pythonの配列の中括弧の中にif-else文を使用できますか?

A = #some 2D array of length m by n, already initialized 
A = np.float64(A) 
val = someValue #any number, pick a number 

A = [[val for j in range(n) if A[i][j] < val, else A[i][j]=A[i][j]] for i in range(m)] 

これはいい方法ですか?代わりに、numpyがこれを計算するより速い方法を持っていれば、それほど良いとは限りません。

私が達成しようとしています何をすべきか長い方法は、所望の出力がその閾値に、閾値以下のいずれかの値を設定することです

for i in range(m): 
    for j in range(n): 
     if A[i][j] < val: 
      A[i][j] = val 

ようなものになるだろう。

myArray = [otherArray[i] for i in range(theRange) if otherArray[i]>=value and otherArray[i]<=anotherValue] 

この1Dの例は私が望むものではありません。これは、私が探しているコーディングブロックのタイプの一例です。伝統的なif-elseステートメントに対する処理が速いようです。

+1

あなたの予想される出力は何ですか? *条件式*を使うことはできますが、やり方ではできません(たとえば、式の中で代入を行うことはできません)。あなたがここで達成しようとしていることは、私には非常に不明です。 –

+0

@MartijnPieters私はちょうど私の質問を改訂しました。 – Lou

+4

'A [A val] = val' –

答えて

5

numpy配列では、反復(リストの理解)を避けるようにします。時にはそれが必要ですが、この場合はそうではありませんされています

In [403]: A=np.arange(16).reshape(4,4)  
In [404]: A1=A.astype(np.float64) # better syntax for converting to float 

In [405]: A1 
Out[405]: 
array([[ 0., 1., 2., 3.], 
     [ 4., 5., 6., 7.], 
     [ 8., 9., 10., 11.], 
     [ 12., 13., 14., 15.]]) 

テストはTrue/Falseのあるところを示してブール配列:

In [406]: A1<5 
Out[406]: 
array([[ True, True, True, True], 
     [ True, False, False, False], 
     [False, False, False, False], 
     [False, False, False, False]], dtype=bool) 

私たちは、このようなマスクでインデックスをすることができます

In [407]: A1[A1<5]=5 

In [408]: A1 
Out[408]: 
array([[ 5., 5., 5., 5.], 
     [ 5., 5., 6., 7.], 
     [ 8., 9., 10., 11.], 
     [ 12., 13., 14., 15.]]) 

np.where(およびnp.nonzero)戻り値は条件がTrueの場合のインデックスです。

In [410]: np.where(A<5,5,A) 
Out[410]: 
array([[ 5, 5, 5, 5], 
     [ 5, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

我々もclipnp.maximumとを行うことができます:whereは(各要素に対して)三項演算子のように動作バージョンを持っている

In [411]: np.maximum(A,5) 
Out[411]: 
array([[ 5, 5, 5, 5], 
     [ 5, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

In [417]: A.clip(5,None) 
Out[417]: 
array([[ 5, 5, 5, 5], 
     [ 5, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 
+0

素晴らしい例で、np.where((A < 3) | (A > 10)、np.nan、A)などの複数の条件を実行できますが、Aがどこの値のリストであるかを特定する簡単な方法をまだ見つけていませんすなわち、[3,5,9,12,2]を平らにすることなく、リストcomprを使用します。再形成する。上記のいずれにも拡張がありますか?どこで比較しても同じですか? –

2

Pythonの一行三項演算子の構文は、この

variable = a if CONDITION else b 

のように見えるあなたにも、リスト内包表記の内側にこれを置くことができます。あなたの例ではvalが何であるかは明らかではありませんが、私が前もって指定した値であると仮定しています。

+0

これはうまくいった!後でnp.float64にタイプ変換をしなければなりませんでした。それ以外の場合は、私が望むものとまったく同じでした – Lou

+2

'A'は配列なので、' A [i、j] 'を使って要素をインデックスすると、より明確になります。 – hpaulj

関連する問題