配列処理2

配列とその要素の位置について。

where関数

条件に合う要素の位置を返す。
条件文の書き方は演算子の比較演算子を参考に。

a=[0,1,2,3,4,5,6,7,8,9]
b=where(a eq 3, n) ; 「aの中の3に等しい要素の位置」を調べている。
print,b ;→ 3
print,n   ;→ 1
bには3が返されている。nには,bの要素数が入る。
このように配列の位置は0,1,2,3…と数える

b=where(a ge 3 and a le 6) ; 「aの中で3以上6以下の要素はどこか」
ここでbは[3,4,5,6]という配列で返される。andの他,orも使用できる。

2次元以上の配列

a=[[0,1,2,3,4],[5,6,7,8,9]] ; 5×2の行列
b=where(a eq 7)
この場合、bの値は7となる。
1次元でない配列でも場所の数え方は続いている。

配列から指定した要素を取りだす

a=[0,10,20,30,40,50,60,70,80,90]
b=5
c=a[b] ; aの中からbの場所の要素を得る
cは50となる。

a=[0,10,20,30,40,50,60,70,80,90]
b=[3,5,8]
c=a[b]
この場合cは[30,50,80]となる。

a=[0,10,20,30,40,50,60,70,80,90]
b=a[3:7] ; aの3~7にある要素を得る
bは[30,40,50,60,70]となる

配列番号0からnまでを続けて抜き出したい場合は,
a=[0,10,20,30,40,50,60,70,80,90]
array=indgen(n+1)
a=a[array]
などととすればいい。aが二次元配列(i行×j列)の場合は
a=a(*, array)
とすればaをi行×array列の配列として抽出可能。

  • アスタリスクも使用可能
a=[0,10,20,30,40,50,60,70,80,90]
b=a[5:*] ; aの5から先の全ての要素を得る
bは[50,60,70,80,90]となる。

whereで配列を指定して値を代入

A=[0,0,0,0,0,0,0,0,0,0]
B=[0,1,0,0,1,0,0,1,0,0]
lab=where(B eq 1)

A(lab)=1
とすると,配列番号を指定して値を代入できる.結果は以下のようになる.
IDL> print,A
      0       1       0       0       1       0       0       1       0       0

配列の行と列の入れ替え(transpose)

a=[[1,2,3],[4,5,6]]
print,a
とすると,出力結果は以下のようになる。
      1       2       3
      4       5       6
これの行と列を入れ替えるには,次のようにする。
b=transpose(a)
print,b
この出力結果は
      1       4
      2       5
      3       6
となる。

配列の一部に値を返す

a=[0,1,2,3,4]
a[2]=10
IDL> print,a
       0       1      10       3       4

a=[[0,1],[2,3]]
b=[[4,5],[6,7]]
c=[[8,9],[10,11]]
d=[[12,13],[14,15]]
e=[[a,b],[c,d]]
IDL> print,e
       0       1       4       5
       2       3       6       7
       8       9      12      13
      10      11      14      15

IDL> e[1,1]=a
IDL> print,e
       0       1       4       5
       2       0       1       7
       8       2       3      13
      10      11      14      15

IDL> map=[[1,1],[1,1]]
IDL> map2=intarr(5,5)
IDL> map2[1,1]=map
IDL> print,map2
       0       0       0       0       0
       0       1       1       0       0
       0       1       1       0       0
       0       0       0       0       0
       0       0       0       0       0

配列の要素数

n_elements(arr)でarrの配列数

indgen,findgen,dindgen

0から1づつ増える指定した大きさの配列を作る。
それぞれint、float、doubleの値が入る。
a=indgen(10) ;  [0,1,2,3,4,5,6,7,8,9]
b=findgen(10) ;  [0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]

ソート(sort)

配列の数字を小さい順にソートする為の位置を得る
IDL> a=[50,150,0,100]
IDL> print,sort(a)
           2           0           3           1
IDL> print,a[sort(a)]
       0      50     100     150

配列のリサイズ(rebin)

配列をリサイズするには,rebin関数を用いる.配列の拡張を行う場合は以下のようにする.
IDL> a = [20, 40, 60]
IDL> print, rebin(a,6)
     20      30      40      50      60      60
要素間の差を使うので,最後の要素に関しては補間できていない.また,/sample オプションをつかうと,
IDL> print, rebin(a,6,/sample)
     20      20      40      40      60      60
と,同じ数字で補間する.また,配列の圧縮を行う場合は,
IDL> a =indgen(10)
IDL> print,a
      0       1       2       3       4       5       6       7       8       9
IDL> print, rebin(a,5)
      0       2       4       6       8
のようにできる.また,配列の列数を変えることもできる.
IDL> print, rebin(a,5,4,/sample)
      0       2       4       6       8
      0       2       4       6       8
      0       2       4       6       8
      0       2       4       6       8
最終更新:2013年12月09日 22:55
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。