zsh2270365028的个人博客分享 http://blog.sciencenet.cn/u/zsh2270365028

博文

[转载]IDL 数组相关函数

已有 3444 次阅读 2019-3-22 09:32 |个人分类: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) LONG = 30 IDL> help,size(arr,/Dimensions) 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]) INT = Array[2, 4, 3] IDL> help,transpose(arr,[2,1,0]) INT = Array[4, 3, 2] IDL> help,transpose(arr) INT = Array[4, 3, 2] 6.数组旋转 (1) Rotate()函数:可以以90°的整倍数角度对数组进行旋转操作。调用格式为 Result=Rotate(数组,Direction) 其中,Direction取值范围为0~7。对应的图像旋转方式见表 Rotate函数Direction参数说明 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

https://blog.sciencenet.cn/blog-587102-1168950.html

上一篇:[转载]IDL中全局变量的处理
下一篇:IDL中求模函数mod()
收藏 IP: 119.78.226.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-20 04:14

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部