1.信息獲取
Size()函數能夠獲取數組的相關信息。不設置關鍵字是,函數返回變量的基本信息:第一個返回值是變量的維數N_dims,但當變量是敞亮或未定義是返回值為0;第二個 到第N_dims+1個返回值依次對應每一維數值;倒數第二個返回值是數組類型代碼;最后一個返回值是元素總個數。若設置關鍵字N_Dimensions、N_Elements、Dimensions、Tname和Type,則依次返回數組的維數、元素個數、每一維的位數、類型名稱和類型代碼信息。
IDL> var=5 IDL> ;依次為0維 整數 共1個元素 IDL> print,size(var) 0 2 1 IDL> str=['abc','def'] IDL> ;依次對應1維 1維上2個元素 字符串型 共兩個元素 IDL> print,size(str) 1 2 7 2 IDL> arr=findgen(5,6) IDL> help,size(arr,/N_elements) <Expression> LONG = 30 IDL> help,size(arr,/Dimensions) <Expression> LONG = Array[2]
2,.條件查詢
函數WHERE()能返回數組中滿足指定條件的元素下標。調用格式為
Result=Where(數組表達式[,count][,Complement=變量1][,/L64][,NCOMPLEMENT=變量2])
其中,關鍵字count返回符合指定條件的元素個數;變量1為不滿足條件的數組元素下標;變量2為不滿足條件的數組元素個數。
IDL> arr=indgen(10) IDL> print,arr 0 1 2 3 4 5 6 7 8 9 IDL> result=where(arr GT 5,count,complement=res_c,ncomplement=res_n) IDL> print,count 4 IDL> print,result 6 7 8 9 IDL> print,res_c 0 1 2 3 4 5 IDL> print,res_c 0 1 2 3 4 5 IDL> print,res_n 6
3.調整大小
(1) Reform()函數:可以在不改變數組元素個數的前提下改變數組的維數。調用格式為
Result=Reform(Array,D1[,...,D8][,關鍵字])
IDL> arr=indgen(10,10,10) IDL> b=reform(arr,200,5) IDL> c=arr[0,*,*] IDL> help,c C INT = Array[1, 10, 10] IDL> d=reform(arr[0,*,*]) IDL> help,d D INT = Array[10, 10]
(2) Rebin()函數:可以修改數組大小,修改后數組的行數或列數必須是原數組行數或列數的整數倍。默認抽樣算法是雙線性內插法。調用格式為
Result=Rebin(數組,D1[,...,D8][,/Simple])
其中,Sample為使用最近臨值抽樣算法。
IDL> arr=[[0,6],[2,8]] IDL> print,arr 0 6 2 8 IDL> print,rebin(arr,4,4) 0 3 6 6 1 4 7 7 2 5 8 8 2 5 8 8 IDL> print,rebin(arr,4,4,/sample) 0 0 6 6 0 0 6 6 2 2 8 8 2 2 8 8 IDL> print,rebin(arr,3,4) % REBIN: Result dimensions must be integer factor of original dimensions % Execution halted at: $MAIN$
(3) Congrid()函數:可以將數組調整為同維任意大小。處理以為或者二位數組時,默認算法是最近鄰重采樣;處理三維數組時,算法是雙線性內插。在對數組進行縮小操作時,Rebin()函數進行差值處理;Congrid()函數僅進行重采樣。調用格式為
Result=Congid(數組,X,Y,Z[,關鍵字])
其中,關鍵字INTERP為抽樣采用線性內插;關鍵字CUBIC為卷積內插法
IDL> print,arr 0 6 2 8 IDL> print,congrid(arr,3,4) 0 6 6 0 6 6 2 8 8 2 8 8
(4) Interpolate()函數:可以將數組調整到同維任意大小,並支持任意定位差值。調用格式為
Interpolate(數組,X[,Y[,Z]][,關鍵字])
其中,X[,Y[,Z]]為待調整數組下標索引,可以是單個變量或數組。若X為0.5,則表示計算下標[0]和小標[1]中間位置的數值。關鍵字選擇GRID為采用網格差值方式生成插值點;否則,采用線性內插方式。關鍵字Missing為插值點坐標超出數組自身坐標范圍時賦予該值。
IDL> arr=findgen(2,2) IDL> print,arr 0.000000 1.00000 2.00000 3.00000 IDL> print,interpolate(arr,[0,.5,1.5],[0,.5,1.5]) 0.000000 1.50000 3.00000 IDL> print,interpolate(arr,[0,.5,1.5],[0,.5,1.5],/grid) 0.000000 0.500000 1.00000 1.00000 1.50000 2.00000 2.00000 2.50000 3.00000 IDL> print,interpolate(arr,[0,.5,1.5],[0,.5,1.5],/grid,missing=0) 0.000000 0.500000 0.000000 1.00000 1.50000 0.000000 0.000000 0.000000 0.000000
4.數組反轉
Reverse()函數可以對數組進行翻轉。調用格式為
Result=Reverse(數組,index[,/overwrite])
其中,關鍵字Index為數組的維數索引
IDL> arr=indgen(2,2) IDL> print,arr 0 1 2 3 IDL> ;行反轉 IDL> print,reverse(arr,1) 1 0 3 2 IDL> ;列反轉 IDL> print,reverse(arr,2) 2 3 0 1
5.數組轉置
調用格式
Result=Transpose(數組,[p])
其中關鍵字P為需要調整維數的數組列表,如不設置,則完全反轉
IDL> arr=indgen(2,3,4) IDL> help,arr ARR INT = Array[2, 3, 4] IDL> help,transpose(arr,[0,2,1]) <Expression> INT = Array[2, 4, 3] IDL> help,transpose(arr,[2,1,0]) <Expression> INT = Array[4, 3, 2] IDL> help,transpose(arr) <Expression> INT = Array[4, 3, 2]
6.數組旋轉
(1) Rotate()函數:可以以90°的整倍數角度對數組進行旋轉操作。調用格式為
Result=Rotate(數組,Direction)
其中,Direction取值范圍為0~7。對應的圖像旋轉方式見表
Direction | 是否轉置 | 順時針旋轉角度 | 旋轉后坐標X1 | 旋轉后坐標Y1 |
0 | 否 | 0° | X0 | Y0 |
1 | 否 | 90 ° | Y0 | -X0 |
2 | 否 | 180 ° | -X0 | -Y0 |
3 | 否 | 270 ° | -Y0 | X0 |
4 | 是 | 0 ° | Y0 | X0 |
5 | 是 | 90 ° | -X0 | Y0 |
6 | 是 | 180 ° | -Y0 | -X0 |
7 | 是 | 270 ° | X0 | -Y0 |
Rotate()函數的調用示例代碼如下:
IDL> arr=indgen(2,3) IDL> print,arr 0 1 2 3 4 5 IDL> print,rotate(arr,1) 4 2 0 5 3 1 IDL> print,rotate(arr,2) 5 4 3 2 1 0
(2)Rot()函數:可以以任意角度對圖像進行旋轉,同時能進行放大和縮小控制。調用格式為
Result=Rot(數組,Angle,[Mag,X0,Y0],[關鍵字])
其中,Angle為數組旋轉的角度,單位為度(°);Mag為放大的倍數;X0為旋轉中心的X坐標,默認為列中心;Y0為旋轉中心的Y坐標,默認為行中心;關鍵字選擇PIVOT可控制旋轉后(X0,Y0)點是否仍然在原圖像中的位置,不設置則(X0,Y0)點在圖像的中心位置。
IDL> data=bytscl(dist(256)) IDL> tv,data IDL> tv,rot(data,33,1.5,/interp)
7.數組平移
Shift()函數可以基於指定平移量S1...Sn對數組進行第1...n維平移,其中,Si值為正表示向前平移;Si為負表示向后平移。調用格式為Result=Shift(數組,S1...Sn)
IDL> arr=indgen(5) IDL> print,arr 0 1 2 3 4 IDL> print,shift(arr,1) 4 0 1 2 3 IDL> print,shift(arr,-1) 1 2 3 4 0 IDL> arr=indgen(4,4) IDL> print,shift(arr,2) 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 IDL> print,shift(arr,1,1) 15 12 13 14 3 0 1 2 7 4 5 6 11 8 9 10
8.數組排序
Sort()函數實現數組的排序功能,返回結果是排序后數組的下標索引。調用格式為
Result=Sort(數組[,/L64])
IDL> arr=[5,2,1,3,4] IDL> ;數組排序后索引 IDL> print,sort(arr) 2 1 3 4 0 IDL> ;排序后數組 IDL> print,arr[sort(arr)] 1 2 3 4 5
9.求不同值
Uniq()函數能返回數組中相鄰元素不同值的索引。注意,該函數只能發現相鄰值;若不相鄰,則會認為是兩個值。如果先對數組進行排序,則可求出數組中包含的不同值。調用格式為
Result=Uniq(數組[,Index])
IDL> arr=[5,2,1,3,4] IDL> ;數組排序后索引 IDL> print,sort(arr) 2 1 3 4 0 IDL> ;排序后數組 IDL> print,arr[sort(arr)] 1 2 3 4 5 IDL> arr=[1,2,1,3,3] IDL> print,arr[uniq(arr)] 1 2 1 3 IDL> print,arr[uniq(arr[sort(arr)])] 2 1 3
10.判斷數組
Array_Equal(數組,/關鍵字)
其中,Result返回值為0或1;關鍵字No_TypeConv用於將兩數組轉換為同一類型,來判斷數組元素是否相同;為1時,數組可直接比較,不轉換數據類型。
IDL> arr1=[1,1] IDL> arr2=[1b,1b] IDL> print,array_equal(arr1,arr2) 1 IDL> print,array_equal(arr1,arr2,/no_typeconv) 0
11.求元素個數
IDL> arr=intarr(4,5,2) IDL> print,n_elements(arr) 40
12.求最大值
Max()函數返回數組元素中的最大值。調用格式為
Result=Max(數組 [,關鍵字],min=變量1)
其中Result返回數組的最大值;變量1返回數組的最小值
IDL> arr=findgen(2,3,2) IDL> print,arr 0.000000 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 10.0000 11.0000 IDL> print,max(arr,min=minval) 11.0000 IDL> print,minval 0.000000
13.求最小值
Min()函數與Max()函數類似,但它返回數組元素的最小值。調用格式為
Result=min(數組 [,關鍵字],max=變量1)
其中,Result返回數組最小值;變量1返回數組最大值。
IDL> arr=findgen(2,3,2) IDL> print,min(arr,max=maxval) 0.000000 IDL> print,maxval 11.0000
14.求和
Total()函數可以計算數組中所有或部分元素的和。調用格式為
Result=Total(數組,Dimension,[,關鍵字])
其中,Result返回數組元素求和結果;Dinension為求和元素的行列控制;Cumulative返回同大小數組,數組第i個元素值為0~i元素值的和;Double返回雙精度值;integer返回整型值;preserve_type結果類型與原數組類型一致,設置該關鍵字時,double等關鍵字無效。
IDL> arr=findgen(2,3) IDL> print,arr 0.000000 1.00000 2.00000 3.00000 4.00000 5.00000 IDL> ;數組求和 IDL> print,total(arr) 15.0000 IDL> ;新數組,每個值為原數組0-i個元素的和 IDL> print,total(arr,/cumulative) 0.000000 1.00000 3.00000 6.00000 10.0000 15.0000 IDL> ;按行求和 IDL> print,total(arr,1) 1.00000 5.00000 9.00000 IDL> ;按列求和 IDL> print,total(arr,2) 6.00000 9.00000
15.乘積計算
Product()函數計算數組中所有或部分元素的乘積。調用格式為
Result=product(數組,Dimension,[,關鍵字])
其中,關鍵字與total函數的基本一致。
IDL> arr=findgen(2,3)+1 IDL> print,arr 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 IDL> ;數組元素乘積 IDL> print,product(arr) 720.00000 IDL> ;新數組,每個值為原數組0-i個元素的乘積 IDL> print,product(arr,/cumulative) 1.0000000 2.0000000 6.0000000 24.000000 120.00000 720.00000 IDL> ;按行求乘積 IDL> print,product(arr,1) 2.0000000 12.000000 30.000000 IDL> ;按列求乘積 IDL> print,product(arr,2) 15.000000 48.000000
16.階乘計算
Factorial()函數計算數N的階乘,即N!。調用格式為
Result=factorial(數組,[,關鍵字])
其中,關鍵字Stirling返回結果為Stirling近似值,計算公式為N!=√(2πN)[N/e]N
IDL> ;求5的階乘 IDL> print,factorial(5) 120.00000
17.平均值計算
Mean()函數計算數組元素平均值。調用格式為
Result=Mean(數組,[,關鍵字])
IDL> arr=[65,63,67,64] IDL> print,mean(arr) 64.7500
18.方差計算
Variance()函數計算數組的方差。調用格式為
Result=Variance(數組,[,關鍵字])
IDL> arr=[1,1,1,2,5] IDL> print,variance(arr) 3.00000
19.標准差計算
Result=Stddev(數組,[,關鍵字])
IDL> arr=[1,1,1,2,5] IDL> print,stddev(arr) 1.73205
20.平均值、方差、傾斜度及頻率曲線峰值計算
Moment()函數可以計算數組的平均值、方差、傾斜度及頻率曲線峰態。調用格式為
Result=Moment(數組,[,關鍵字])
IDL> arr=[1,1,1,2,5] IDL> print,moment(arr) 2.00000 3.00000 0.923760 -1.13333