1
私は既存の配列Xを持っていて、Xから値を抽出して新しい配列new_xに入れたいのですがどうしたらいいですか?空の配列を作成してIDLに新しい値を入れよう
私はレンジ関数を使って配列の一部を取ることができますが、forループを使って書かれた条件を使ってXからデータを抽出していることを理解しています。
私は既存の配列Xを持っていて、Xから値を抽出して新しい配列new_xに入れたいのですがどうしたらいいですか?空の配列を作成してIDLに新しい値を入れよう
私はレンジ関数を使って配列の一部を取ることができますが、forループを使って書かれた条件を使ってXからデータを抽出していることを理解しています。
配列の大きさによって、さまざまな方法があります。最も簡単な方法は、値を新しい配列に連結することです。たとえば:
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の特定のデータ範囲内であった値を望んでいたとしましょう。
これらのメソッドはIDL> = 8.0(特に '/ WHERE()'と空の配列初期化子の '/ NULL'キーワード)にのみ有効です。 – sappjw
ありがとうございます!あなたの反応は本当に役に立ちました。 – jenn
'x [where()]'は、条件に一致する要素が見つからない場合は 'where()'から保護している限り、IDL <8.0で正常に動作するはずです(または安全に少なくとも1つの要素が条件を満たすと仮定します)。 –