zoukankan      html  css  js  c++  java
  • 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

    转载于:https://www.cnblogs.com/wintertone/p/6596672.html

  • 相关阅读:
    Linux下多进程编程消息队列
    Linux下多线程编程之——线程专有数据
    Linux下多线程编程之——线程互斥
    Linux下多线程编程之——线程竞争
    Linux下多线程编程之——线程取消
    Linux下多线程编程之——线程分离
    Linux下多线程编程之——多线程委托模型
    Postman 提交测试的时候提示 Bad Request
    Confluence 6 其他页面操作和页面大小
    Confluence 6 页面的组织和移动概述
  • 原文地址:https://www.cnblogs.com/twodog/p/12140999.html
Copyright © 2011-2022 走看看