配列とその要素の位置について。
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