目录

1. 创建数组

1.1 直接创建

1. 2 利用函数创建

2. 数组索引

3. 数组操作

3.1 数组的信息

3.2 数组维度变化

3.3 数组的最大值和最小值

3.4 数组方差、均值、标准差、总和运算

3.5 数组元素筛选及重新赋值

3.6 数组元素的排序

3.7 数组间比较

4. 数组运算

4.1 加、减法运算

4.2 乘除运算


IDL 语言支持数组运算,创建、下标与Python一样,可以利用“[]”、函数进行创建,先列标,再行标,序号从0开始。

1. 创建数组

1.1 直接创建

直接创建数组适合数据量少、无规律的数组。

>>a = [1]
>>help,a
A               INT       = Array[1]
>>b = 1
>>help,b
B               INT       =        1
>>print,size(a,/Type)2
>>print,size(b,/Type)2

分析:加上[]后,类型变为Array,而如果不加上,仅仅是一个数,但从其存储上看,两者没区别,因此,一个数也能视为一个1×1的数组,但对于含有多元素的数组来说,必须加上“[]”

>>c= 2,3
% Keyword C not allowed in call to: PRINT
% Execution halted at: $MAIN$
>>d = [2,3]
>>help,d
D               INT       = Array[2]

创建多维数组,每一行都需要加上[],没一个二维矩阵也要加上[],例如,

>>a = [[1,2,3],[3,2,1]]
>>help,a
A               INT       = Array[3, 2]
>>a1       2       33       2       1
>>a.DIM3           2

分析:数组a是一个3列2行的数组,每一行都加上[],这个与Matlab不同,和python语法一致。

>>b = [[[1,2,3],[3,2,1]],[[0,1,0],[0,2,4]]]
>>help,b
B               INT       = Array[3, 2, 2]>>b1       2       33       2       10       1       00       2       4
>>>>b.DIM3           2           2

分析:数组a是一个3列2行2维度的数组,每一个二维数据都用“[]”括起来。

创建字符串数组,也可以用这种方法。

>>e = ['Hlz','Hulizhen']
>>e
Hlz
Hulizhen
>>help,e
E               STRING    = Array[2]
>>f = [['Hlz'],['Hulizhen']]
>>f
Hlz
Hulizhen
>>help,f
F               STRING    = Array[1, 2]

分析:e是2列1行的字符串数组,f是1列2行的数组。

1. 2 利用函数创建

这种方式适合数据量大、有规律的数组,常见的函数如下表所示。

数据类型 创建全0数组 创建索引数组
Byte 字节 byteArr() bindgen()
int 整型 16位(2×8) intarr() indgen()
uint 无符号整型 uintarr() uindgen()
long 长整型 lonarr() lindgen()
ulong 无符号长整型 ulongarr() ulindgen()
long64 64位长整型 lon64arr() l64indgen()
ulong64 无符号64位长整型 ulon64arr() ul64indgen()
float 浮点型 fltarr() findgen()
double float 双精度浮点型 dblarr() dindgen()
complex 复数 complexarr() cindgen()
double complex 双精度复数 dcomplex() dcindgen()
string 字符串  strarr() sindgen()
ptr_new 指针 ptrarr()
obj_new 对象 objarr()

例如:创建一个4×3(3列4行)的全0整型数组a,可以用intarr()函数。

>>a = Intarr(3,4)
>>a0       0       00       0       00       0       00       0       0

例如:创建一个4×3(3列4行)的索引整型数组b,可以用indgen()。

>>b = Indgen(3,4)
>>b0       1       23       4       56       7       89      10      11

例如:创建一个2×3×4(2行3列4维)的索引数组c,可以用indgen()。

>>c = Indgen(3,2,4)
>>c0       1       23       4       56       7       89      10      1112      13      1415      16      1718      19      2021      22      23

等差数组:可以在索引数组的基础上利用数组运算在创建等差数列数组

>>d =Indgen(3,4)
>>d0       1       23       4       56       7       89      10      11
>>e = d+1
>>e1       2       34       5       67       8       910      11      12
>>f = e*2
>>f2       4       68      10      1214      16      1820      22      24

元素相同的数组:可以在全0数组的基础上利用数组运算在创建等差数列数组,也可以利用replicate(Value,d1[,...,d8])

>>g = Intarr(2,3)
>>g0       00       00       0
>>h = g+5
>>h5       55       55       5
>>i  = Replicate(5,2,3)
>>i5       55       55       5

此外,还可以利用make_array()函数创建,具体用法,此处不具体展开。

语法:Result = MAKE_ARRAY ( [D1[, ..., D8]], DIMENSION=vector, INCREMENT=value, /INDEX, /NOZERO, SIZE=vector, START=value, TYPE=type_code, VALUE=value, /BOOLEAN, /BYTE, /COMPLEX, /DCOMPLEX, /DOUBLE, /FLOAT, /INTEGER, /L64, /LONG, /OBJ, /PTR, /STRING, /UINT, /UL64, /ULONG )

>>j = MAKE_ARRAY(2, 3, /INTEGER, VALUE = 5)
>>j5       55       55       5

2. 数组索引

IDL语言不同于Matlab,其下标是从0开始计算的,并且多维数组顺序为,列、行、维。

>>a = Indgen(3,2,4)
>>a0       1       23       4       56       7       89      10      1112      13      1415      16      1718      19      2021      22      23
>>a(0,0,0)0
>>a(1,0,0)1
>>a(2,0,0)2
>>a(3,0,0)
% Attempt to subscript A with <INT      ( 3)> is out of range.
% Execution halted at: $MAIN$  

分析:为什么 a(3,0,0)报错?因为是下标是从开始,多维的顺序是列、行、维,因此a(3,0,0)不存在。

注意:从IDL8.0开始,支持下标索引为负数,其表示从后往前数,向python看齐了!

>>a = Indgen(4,1)
>>a0       1       2       3
>>a(-1,0)3

3. 数组操作

3.1 数组的信息

每个数组都有行、列(可能还有维度)元素个数等信息,可以利用size()函数进行获取。

Result = SIZE( Expression [, /L64] [, /DIMENSIONS | , /FILE_LUN | , /FILE_OFFSET | , /N_DIMENSIONS | , /N_ELEMENTS | , /SNAME, | , /STRUCTURE | , /TNAME | , /TYPE] )

返回值:

依次表示:数度个数(一维、二维、……)、列(若不存在则不显示)、行(若不存在则不显示)、第三维(若不存在则不显示)、数据类型代码(int、long、……)、元素个数。

例如:一个数a(type)型,则显示维度个数、数据类型、元素个数

>>a = 1B
>>print,size(a)0           1           1

例如:一个3×2的矩阵a(int型),其数组的信息为:

>>a = Indgen(2,3)+1
>>a1       23       45       6
>>print,size(a)     ;依次表示:数组类型(一维、二维、……)、列、行、数据类型代码(int、long、……)、元素个数2           2           32           6
>>print,N_elements(a) ;元素个数6
>>print,a.DIM       ; 矩阵维度2           3
>>print,Typename(a)    ; 数据类型代码,0(不明确)、1(Byte)、2(int)、3(long)……
INT

例如:一个2×3的矩阵b(float)型,其数组的信息为:

>>b = [[1.0,2,3],[8,8,9]]
>>b1.0000000       2.0000000       3.00000008.0000000       8.0000000       9.0000000
>>; 数据类型代码4对应的数据类型为float
>>print,Typename(b)
FLOAT
>>print,b.DIM3           2
>>print,b.LENGTH ; 数据的长度6
>>print,size(b)2           3           2           4           6
>>; 分别表示矩阵的维度、列、行、数据类型代码、元素个数

例如:一个4×3×5的数组a(int),其数组的信息为:维度个数、列、行、第三维、数据类型代码,元素个数;

>>a = Indgen(3,4,5)
>>a0       1       23       4       56       7       89      10      1112      13      1415      16      1718      19      2021      22      2324      25      2627      28      2930      31      3233      34      3536      37      3839      40      4142      43      4445      46      4748      49      5051      52      5354      55      5657      58      59
>>print,Size(a)3           3           4           5           2          60

总结:数度个数(必须有)、列(若不存在则不显示)、行(若不存在则不显示)、第三维(若不存在则不显示)、数据类型代码(必须有)、元素个数(必须有)。

3.2 数组维度变化

(1)选取数据:

可以通过下标进行选取数据,下标从0开始,度数表示反过来数,1

>>a = Indgen(2,4)
>>a0       12       34       56       7
>>a[0:1,2:3]4       56       7
>>a[0:1,-1]6       7
>>a[1,0:-1]    ;-1表示最后一个数;1357
>>a[1,0:-2]    ;-2表示倒数第二个数135

(2)维度调整:

可以通过Reform()函数改变数组的维度信息,先行后列的调整维度。

Result = REFORM( Array, D1[, ..., D8] [, /OVERWRITE] )

>>b = Reform(a,4,2)
>>b0       1       2       34       5       6       7

(3)数组扩展

可以用Rebin()函数修改数组大小,修改后的行数、列数是原先行、列的整数倍,默认使用双线性内插的方法。

可以用Congrid()函数修改数组的大小,默认使用最近邻重采样。

可以用Interpolate()函数将数组调整同维度任意大小,并支持定向插值。

>>a = Indgen(2,3)+2
>>a2       34       56       7
>>print,Rebin(a,4,9)2       2       3       32       2       3       33       3       4       44       4       5       54       4       5       55       5       6       66       6       7       76       6       7       76       6       7       7
>>print,Congrid(a,3,4)2       3       32       3       34       5       56       7       7

3.3 数组的最大值和最小值

最大值函数max()、最小值函数min(),

Result = MAX( Array [, Max_Subscript] [, /ABSOLUTE] [, DIMENSION=value] [, MIN=variable] [, /NAN] [, SUBSCRIPT_MIN=variable])

Result = MIN( Array [, Min_Subscript] [, /ABSOLUTE] [, DIMENSION=value] [, MAX=variable] [, /NAN] [, SUBSCRIPT_MAX=variable])

注:数组中有空值的时候,可以用关键字/Nan,此时空值不计算

3.4 数组方差、均值、标准差、总和运算

方差函数Variance()、均值函数Mean()、标准差Stddev()、求和函数Total()

Result = VARIANCE( X  [, DIMENSION=value] [, /DOUBLE] [, /NAN] )

Result = MEAN( X   [, DIMENSION=value] [, /DOUBLE] [, /NAN] )

Result = STDDEV( X  [, DIMENSION=value] [, /DOUBLE] [, /NAN] )

Result = TOTAL( Array [, Dimension] [, /CUMULATIVE] [, /DOUBLE] [, /INTEGER] [, /NAN] [, /PRESERVE_TYPE] )

3.5 数组元素筛选及重新赋值

利用Eq等于、Lt小于、Gt大于、 LE小于等于、GE大于等于,可以判断符合条件元素对应的索引

>>a = [1,4,6,2,4,7,9,10]
>>a1       4       6       2       4       7       9      10
>>print,a Gt 50   0   1   0   0   1   1   1
>>print,a lE 51   1   0   1   1   0   0   0

配合where()函数,可以提取满足条件的元素。

>>a = [1,4,6,2,4,7,9,10]
>>b = where(a Gt 5)
>>b2           5           6           7
>>c = where(a le 5)
>>c0           1           3           4

注:A>value、A<value表示将数据中数小于、大于5的数改为5,常用这个方法可以提出负数值。

>>a = [1,4,6,2,4,7,9,10]
>>a1       4       6       2       4       7       9      10
>>print,a>55       5       6       5       5       7       9      10
>>print,a < 51       4       5       2       4       5       5       5

3.6 数组元素的排序

(1)数据反转

Reverse()函数可以实现数据反转

Result = REVERSE( Array [, Subscript_Index] [, /OVERWRITE] )

>>a = Indgen(2,3)+2
>>a2       34       56       7
>>Print,Reverse(a)    ;Reverse(a,1)3       25       47       6
>>Print,Reverse(a,2)6       74       52       3

(2)数据排序

Sort()函数实现数组元素的排序,返回排序的索引下标

>>a = [[2,8,5],[9,9,5]]
>>a2       8       59       9       5
>>print,Sort(a)0           2           5           1           4           3
>>b = a(Sort(a))
>>b2       5       5       8       9       9

注:要实现从大到小排序,可以配合反转函数Reverse(),

>>b = a(Reverse(Sort(a)))
>>b9       9       8       5       5       2

3.7 数组间比较

Array_equal()函数可以用来比较两个数据是否一样!

Result = ARRAY_EQUAL( Op1 , Op2, /NOT_EQUAL, /NO_TYPECONV, /QUIET )

>>a = [1,4,6,2,4,7,9,10]
>>b = [1,4,6,2,4,7,9,1]
>>Print,Array_equal(a,b)
>>Print,Array_equal(a,a)1

4. 数组运算

4.1 加、减法运算

(1)加减运算:IDL支持一个数与整个数组中的每个元素相加减,但不支持不同维度的数组相加。

>>a = 2
>>help,a
A               INT       =        2
>>b = [2]
>>help,b
B               INT       = Array[1]
>>c = [1,2,3]
>>help,c
C               INT       = Array[3]
>>d = a+c
>>help,d
D               INT       = Array[3]
>>d3       4       5
>>e = b+c
>>e3
>>help,e
E               INT       = Array[1]

分析:a是一个数,因此与数组c相加,得到的结果是c中的每一个元素都加上a这个数;b数一个1×1 的数组其与c数组的维度不一致,因此计算的结果不对,实际只计算了c中的第一个元素(因为b只有一个元素)。

>>a = Indgen(4,1)
>>a0       1       2       3
>>b = Make_array(4,1,Value=5)
>>b5       5       5       5
>>c = a+b
>>c5       6       7       8

减法和加法一样,如下所示。

>>d = a-2
>>d-2      -1       0       1
>>e = a-b
>>e-5      -4      -3      -2

4.2 乘除运算

(1)乘除运算:IDL乘法与Matlab不同,matlab中“.*”表示两个数组中对应位置的元素相乘,“*”表示两个矩阵相乘,而IDL中“*”表示两个数组中对应位置的元素相乘,“#”和“##”表示矩阵相乘,“A#B”表示A的列乘以B的行,因此A中的行数,必须等于B的列数;“A##B”表示A的行乘以B的列,因此A中的列数必须等于B中的行数(数学中的矩阵乘法);

>>a = Indgen(2,3)+1
>>a1       23       45       6
>>b = Indgen(2,3)*2
>>b0       24       68      10
>>c = a*b
>>c0       412      2440      60
>>a = Indgen(2,3)+1
>>b = Indgen(3,2)
>>a1       23       45       6
>>b0       1       23       4       5
>>c = a#b
>>c13          1640          52
>>c = a##b
>>c6           9          1212          19          2618          29          40

(2)幂运算: “*”表示两个矩阵相乘,但对于多次幂运算时A*A*A*A……太麻烦,因此用“^n”表示,Matlab用“.n”表示。

>>d = a^2
>>d1       49      1625      36
>>d = a^3
>>d1       827      64125     216

注:后续将针对整理数据相关的函数

不足之处,敬请斧正!

路漫漫其修远兮,吾将上下而求索

IDL学习:语法基础-数组相关推荐

  1. IDL学习:语法基础-指针、链表

    本博客将介绍IDL语法基础中的指针.链表的创建及相关的用法.记录自己的学习+整理+理解 . 1. 指针 指针也就是内存地址,是用来存放内存地址的变量,指针可以理解为通讯地址,可以通过通讯地址查询具体的 ...

  2. Java基础语法(数组)

    第4天 Java基础语法 今日内容介绍 u 流程控制语句(switch) u 数组 第1章 流程控制语句 1.1 选择结构switch switch 条件语句也是一种很常用的选择语句,它和if条件语句 ...

  3. 【Drools二】打工人学习Drools基础语法

    目录 0.项目搭建 1. 规则文件 1.1 构成 1.2规则体 2.基础语法 2.1 注释 2.2 Pattern模式匹配 2.3比较操作符 2.3.1 实践 2.3执行指定规则 3.Drools内置 ...

  4. IDL语法基础(01)

    ⛄IDL简介 交互式数据语言--IDL(Interactive Data Language)是进行应用程序开发.科学数据分析与可视化表达的理想工具.IDL是基于矩阵运算的计算机语言,它语法简单,自带大 ...

  5. Java基础笔记(入门,语法基础,流程控制,数组)

    Java语言入门 发展历程 三大技术体系 JavaSE 标准版 JavaEE 企业版 JavaME 嵌入式版 Java语言特点 简单性 健壮性 面向对象 分布式 多线程 动态性 可移植性(跨平台) J ...

  6. python基础语法及知识总结-Python 学习完基础语法知识后,如何进一步提高?

    ---4.30更新---感谢大家支持,点赞都破两千了.给大家整理出来新的资料,需要的小伙伴来自取: Python练手项目视频如下: Python自学基础知识如下: 以下为原文内容: Python 学习 ...

  7. idea编译的文件怎么用cmd打开_JAVA学习册|基础语法|cmd输出HelloWorld

    看到这个标题,估计已经有小伙伴知识本文要讲什么了,好,下面我们就开始正文 学java最开始的地方 很多老师的书和视频中,在安装完jdk,配置好环境变量,都会带大家用记事本写一个HelloWorld,然 ...

  8. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  9. python学习三-基础语法

    python学习三-基础语法(2019-12-24日晚) 1.源码文件 Python源码文件名通常采用小写的方式,常见的扩展名有: py:基本的源码扩展名. pyw:是另一种源码扩展名,跟py唯一的区 ...

最新文章

  1. Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8
  2. Eclipse中JRE System Library、Web App Libraries的作用
  3. [Linux]NIS: 集中化认证服务
  4. RIL接听电话没有声音的问题 [ RIL_Answer | RIL_SetAudioDevices ]
  5. CentOS 5.6 快速搭建LAMP
  6. 计算机net use命令使用,网络命令net之net use应用
  7. IOS内购流程从0-1手把手教会
  8. python浅复制与深复制_Python中的浅复制与深复制
  9. Python基础——元组与列表
  10. Python数据结构与算法(2.4)——双向链表
  11. 2018年9月8日 笔试小结
  12. 数据-第12课-线性表课后练习
  13. 技术人生:入职半年总结
  14. javaweb基于SSM开发在线问卷调查系统(前台+后台) 课程设计 毕业设计源码
  15. curl怎么输出赋值_伺服电动缸怎么控制?
  16. 计算机中插入背景图片怎样操作,在word中怎么添加背景图片及文字背景
  17. 11.1.4 子线程与主线程通信实例
  18. Centos下增加swap空间
  19. 可视化大屏是什么?有哪些应用场景?
  20. 谷歌公开了内部管理Infra层的两个工具的Paper

热门文章

  1. JS逆向加密——美团店铺详情_token参数
  2. 分布式内存数据技术为查询提速
  3. 58点击软件奔奔_一款强大的私人内容隐藏保护软件,你可以将你所有的隐私加密...
  4. c# 实现两个窗体来回跳转
  5. 常见Web安全漏洞类型
  6. 《全球互联网金融商业模式:格局与发展》——第3章,第4节互联网保险服务公司...
  7. A001-185-2531
  8. 基于javaweb的公文文档收发管理系统
  9. lang:C++自定义异常类——用来处理自制编程语言的异常信息
  10. 暗黑破坏神(diablo)