2016-07-12 8 views
1

私は既存の配列Xを持っていて、Xから値を抽出して新しい配列new_xに入れたいのですがどうしたらいいですか?空の配列を作成してIDLに新しい値を入れよう

私はレンジ関数を使って配列の一部を取ることができますが、forループを使って書かれた条件を使ってXからデータを抽出していることを理解しています。

答えて

2

配列の大きさによって、さまざまな方法があります。最も簡単な方法は、値を新しい配列に連結することです。たとえば:

new_x = [] 
for i=0,n_elements(x)-1 do begin 
    if x[i] "matches condition" then new_x = [new_x, x[i]] 
endfor 

これは、小さな配列のために正常に動作しますが、あなたは常にメモリーを再配分しているため、大規模な配列のために非常に高価で、遅くなります。

"フラグ"配列を使用し、 "WHERE"を使用してインデックスを抽出する方がよいでしょう。たとえば:

flag = BYTARR(N_ELEMENTS(x)) 
for i=0,n_elements(x)-1 do begin 
    if x[i] "matches condition" then flag[i] = 1 
endfor 
new_x = x[WHERE(flag, /NULL)] 

最良の方法は、完全にループのために排除するだろうが、これは可能ではないかもしれません。あなたの問題のために働くだろう、これらの方法の

new_x = x[WHERE(x ge 5 and x le 10, /NULL)] 

うまくいけば、1:たとえば、あなたがちょうどXの特定のデータ範囲内であった値を望んでいたとしましょう。

+1

これらのメソッドはIDL> = 8.0(特に '/ WHERE()'と空の配列初期化子の '/ NULL'キーワード)にのみ有効です。 – sappjw

+0

ありがとうございます!あなたの反応は本当に役に立ちました。 – jenn

+0

'x [where()]'は、条件に一致する要素が見つからない場合は 'where()'から保護している限り、IDL <8.0で正常に動作するはずです(または安全に少なくとも1つの要素が条件を満たすと仮定します)。 –

関連する問題