IDL学习:语法基础-数组

目录

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

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

不足之处,敬请斧正!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

amd为什么还用针脚_为什么AMD不取消cpu上的针脚?

在过去&#xff0c;AMD的速龙系列处理器也使用了LGA触点式接口。包括AMD的皓龙在内的一系列服务器处理器也使用类似于英特尔的LGA接口&#xff0c;但AMD多年来一直在消费级CPU上使用针脚式接口。这样做很好&#xff1f;为什么&#xff1f;这是因为在Intel切换到触点式接口之后&…

IDL学习:语法基础-字符串

1. 创建字符串 IDL中可以用单引号‘’或双引号""来创建字符转 >>a hlz >>b "hlz" >>a eq b1 创建字符串数组&#xff0c;可以利用中括号[]和逗号,相组合的方式进行创建 >>a [Hlz,XMU,厦门] >>a Hlz XMU 厦门 &g…

epoll监听文件_epoll使用详解

epoll介绍epoll的行为与poll(2)相似&#xff0c;监视多个有IO事件的文件描述符。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外&#xff0c;还提供了边缘触发(Edge Triggered)&#xff0c;这就使得用户空间程序有可能缓存IO状态&#xff0c;减少epoll_wait…

IDL学习:语法基础-结构体

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“属性”&#xff08;亦称之为“成员”&#xff09;&#xff0c;这些成员可以是变量、数组、字符串以及结构等类型数据。IDL中常用于函数返回值&#xff08;PS&#xff1a;因为IDL中函数最多…

hdfs数据节点分发什么协议_分布式文件系统HDFS解析

Hadoop 主要由HDFS和MapReduce 引擎两部分组成。最底部是HDFS&#xff0c;它存储Hadoop 集群中所有存储节点上的文件。HDFS 的上一层是MapReduce 引擎&#xff0c;该引擎由JobTrackers 和TaskTrackers组成。一、HDFS基本概念1、数据块HDFS默认的最基本的存储单位是64M的数据块&…

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

本博客将介绍IDL语法基础中的指针、链表的创建及相关的用法。记录自己的学习整理理解 。 1. 指针 指针也就是内存地址&#xff0c;是用来存放内存地址的变量&#xff0c;指针可以理解为通讯地址&#xff0c;可以通过通讯地址查询具体的信息&#xff0c;而指针可以查询所指向的…

计算机等级考试java题型_计算机二级考试《java》试题及答案

计算机二级考试《java》试题及答案2017下半年计算机二级考试将于9月23日-26日举行&#xff0c;下面是小编为大家整理的计算机二级考试《java》试题及答案&#xff0c;欢迎参考~计算机二级考试《java》试题及答案一、判断题1. Java语言中的数组元素下标总是从0开始&#xff0c;下…

IDL学习:语法基础-对象、哈希表

本博客将介绍IDL语法基础中的对象、哈希表的创建及相关的操作发法。哈希表、链表都可以看做对象&#xff0c;包含了add、reserve、Sort等方法。记录自己的学习整理理解 。 1. 对象 对象是数据&#xff08;属性&#xff09;和程序&#xff08;方法&#xff09;封装在一起的实体…

hdfs中8031是什么端口号_在宿主机如何访问docker中hadoop的hdfs:ip:9000啊, 端口映射出来啊...

本人有一个3节点hadoop, 启动了3个docker容器, 众所周知, docker容器内服务的端口是可以映射到宿主机的端口的, 我采用-P将容器的所有端口映射到主机端口, 命令如下:docker run -it -v /Users/yc/hadoop/docker:/test -P -h h1 --name h1 sequenceiq/hadoop-docker /etc/bootst…

linux nginx安启动_linux下nginx编译安装启动

1、在指定目录解压包命令&#xff1a;tar -zxvf nginx-1.10.3.tar.gz解压后&#xff0c;在nginx-1.10.3同级目录下&#xff0c;创建nginx目录(编译安装目录)2、编译安装nginx是需要编译安装&#xff0c;在nginx-1.10.3目录下执行命令命令&#xff1a; ./configure --prefix/usr…

linux怎样自制库_如何制作自己的LINUX系统?

创建工作目录使用busybox生成根文件系统中的bin等目录创建服务启动脚本与inittab文件与fstab文件创建根文件系统的init脚本(initrc使用linuxrc&#xff0c;而initramfs使用init脚本&#xff0c;所以先删除busybox为initrc生成的默认的linuxrc文件&#xff0c;rm-rf$LINUX/linux…

茶苑机器人怎么看出来_小儿脑瘫怎么看出来?出现4个异常,该早点去看医生...

小儿脑瘫表现出来的症状是多种多样的&#xff0c;一般儿童三个月就能够展现出来&#xff0c;家长应该多观察孩子的一些异常情况&#xff0c;及时去医院做诊断&#xff0c;做到防患于未然。小儿脑瘫的表现有哪些&#xff1f;1、运动发育明显落后正常的儿童3个月能抬头&#xff0…

itil 容量管理流程_探索ITIL和DevOps的边界

其实在今天的运维领域&#xff0c;ITIL和DevOps之间的冲突还是蛮明显的&#xff0c;有些是表现在产品上&#xff0c;有些是表现在思维/理念上。ITIL在产品上以流程为核心目标的设计&#xff0c;很难满足自动化的要求&#xff0c;DevOps极力推崇工具/平台/自服务文化&#xff1b…

本博客IDL 学习目录

本博客非技术博客&#xff0c;而是总结我在学习IDL、编写IDL代码方面的博客&#xff0c;旨在方便各位可以通过我这篇博客直接选感兴趣的部分。本博客将会持续更新&#xff0c;不断补充…… IDL 学习 1. IDL 文本编码、代码补全快捷方式、IDL doc、格式器、行号显示设置 2. ID…

python中一个汉字是几个字节_数据库中汉字是几个字节

不依赖微软的库和WindowsAPI&#xff0c;没能试验成功&#xff01;######问题已解决&#xff0c;谢谢。######看这篇文章&#xff0c;讲的很清楚(&#xff1a;)这是从其他地方拷贝过来的) UNICODE环境设置 在安装Visual Studio时&#xff0c;在选择VC时需要加入unicode选项&…

Matlab 中@ 的用法

Matlab 中的用法主要有&#xff1a;函数句柄、函数表达式、调用父类以及类文件夹。 前两种有很多介绍&#xff0c;后两种涉及类&#xff0c;介绍的人很少。前2个例子&#xff0c;参考了其它博客&#xff0c;总感觉用法都写的不全&#xff0c;所以在此基础上&#xff0c;补充了3…

金蝶k3单据编码规则_金蝶K3存货跌价案例教程

目录案例介绍 后台设置 计提存货跌价准备显示计提表计提凭证模板设置计提凭证生成手工结转跌价准备案例介绍关于存货跌价准备&#xff0c;企业会计准则第1号存货相关规定如下&#xff1a;第十五条 资产负债表日&#xff0c;存货应当按照成本与可变现净值孰低计量。存货成本高于…

maven 关联源码插件_繁琐的任务简单化,Maven的插件机制

Maven的生命周期与Maven插件是项目绑定的&#xff0c;生命周期可以理解为项目构建步骤的集合&#xff0c;它定义了各个构建环节的执行顺序&#xff0c;有了这个顺序&#xff0c;Maven 就可以自动化的执行构建命令。Maven 的核心程序中定义了抽象的生命周期&#xff0c;生命周期…

php配置email支持_配置以及实现mail()函数

配置sendmail.ini文件error_logfileerror.log; create debug log as debug.log (defaults to same directory as sendmail.exe); uncomment to enable debuggingdebug_logfiledebug.log; if your smtp server requires authentication, modify the following two linesauth_use…

树莓派控制电机转速_怎样用树莓派控制直流电机的方向和速度

步骤1&#xff1a;DC的控制方向通过RPi电机使用RPi控制直流电机我们的下一个任务是使用树莓派上的python脚本和GPIO头控制直流电动机&#xff0c;这将在我们的脑海中产生一幅“机器人如何工作”的图景。您可以根据外面的天气来控制房间的风扇(因为您知道rpi会使用传感器)。完成…