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

  • 相关阅读:
    使用 Dockerfile 定制镜像
    UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)
    UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)
    LeetCode Best Time to Buy and Sell Stock 买卖股票的最佳时机 (DP)
    LeetCode Number of Islands 岛的数量(DFS,BFS)
    LeetCode Triangle 三角形(最短路)
    LeetCode Swap Nodes in Pairs 交换结点对(单链表)
    LeetCode Find Minimum in Rotated Sorted Array 旋转序列找最小值(二分查找)
    HDU 5312 Sequence (规律题)
    LeetCode Letter Combinations of a Phone Number 电话号码组合
  • 原文地址:https://www.cnblogs.com/twodog/p/12140998.html
Copyright © 2011-2022 走看看