IDL 數組相關函數


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。對應的圖像旋轉方式見表

Rotate函數Direction參數說明
Direction 是否轉置 順時針旋轉角度 旋轉后坐標X1 旋轉后坐標Y1
0  0° X0 Y0
否  90 ° Y0  -X0 
180 ° -X0  -Y0
否  270 ° -Y0  X0 
是  0 ° Y0  X0
是  90 ° -X0  Y0 
是  180 ° -Y0  -X0 
是  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM