NCL变量¶
变量是NCL语言中极具特色的部分。了解NCL变量看起来是必须的,也是最根本的。
变量命名规则¶
变量名必须以字母或下划线(并没有特殊含义)开始,可由任意的字母、数字和下划线构 成。注意变量名是大小写敏感的,也就是说一个大写的变量名和相同内容小写的变量名并不 是同一个东西。目前变量名最大支持256个字符,相信不是有特殊需求的完全是够用了。
合法的变量名 | 非法的变量名 | 错误原因 |
---|---|---|
a | 3a | 数字开头 |
forecast_time | a.b | 包含符号 |
__s092389 | if | 使用关键字 |
构思变量名的时候,最好能遵从一定的规范,以便能让别人甚至是以后的你望文生义。 下面给出一些比较建议
- 使用有意义的名字,以便准确反映它的意义
- 不使用非通用的缩写,不要为了空间去使用缩写,程序是用来看
- 不要使用拼音
- 统一代码中的命名规范
在程序猿的世界里,变量名命名形式有两种通用命名法,可以称之为下划线命名法和驼峰命名 法。你可以自由选用这两种命名法来命名,这里我建议将定义变量使用驼峰命名法,定义 函数和子程序使用下划线命名法。
下划线命名法¶
变量名中所有字母均小写,每个单词间以下划线分割,这种命名方式称为下划线命名法,下 划线法是随着C语言的出现流行起来的。NCL中的函数多数使用下划线命名法。 下面举几个例子:
lon_distance, nc_file, visual_grib
驼峰命名法¶
当变数名和函数名称是由二个或多个单字链接在一起,而构成的唯一识别字时,利用“驼峰 式大小写”来表示,可以增加变数和函数的可读性 [1] ,这种命名法最早出现自Perl语言。 根据首字母是否大写可以分为大驼峰(帕斯卡命名法)和小驼峰。
NCL中所有源变量属性都是使用小驼峰命名法,另外有一些函数也使用小驼峰和大驼峰命名法。 下面列出几个大小驼峰变量名:
firstName, myLastName ; 小驼峰
FirstName, MyLastName ; 大驼峰(帕斯卡命名法)
[1] | https://zh.wikipedia.org/zh-cn/%E9%A7%9D%E5%B3%B0%E5%BC%8F%E5%A4%A7%E5%B0%8F%E5%AF%AB |
元数据¶
NCL变量可以有辅助信息,称之为元数据。元数据是从属于变量的。这些元数据与NetCDF数据 结构十分相似,因此NCL变量模型就是参照NetCDF数据模型设计的。它们可以分为三类, 属性 ,维 和 坐标 ,下面将会一一介绍。
属性¶
属性是附属于变量或文件的一些描述信息片段,是对特定数据的补充说明。属性的值可以是
数组但不能是文件。NCL中引用变量属性的方式是 variable@attribute
,即
使用符号 @
来连接变量和变量的属性。对变量属性的赋值使用赋值运算符,
variable@attribute = value
。常见的变量属性包括
属性名称 | 属性含义 | 属性功能 |
---|---|---|
long_name | 描述变量的具体名称 | csm绘形函数使用其作为gsnLeftString |
_FillValue | 描述变量的缺测值 | 大多数函数计算时自动忽略掉缺测值 |
units | 描述变量的单位 | csm图形函数使用其作为gsnRightString |
add_offset | 描述变量值的压缩截距 | short2flt函数使用这两个属性,
来解包short压缩数据
|
scale_factor | 描述变量值的压缩斜率 | |
lon2d | 描述变量的二维经度 | csm绘图函数使用其作为sf*Array,
无需做数学变换即可更改投影
|
lat2d | 描述变量的二维纬度 |
注解
变量的属性并不一定具有功能,我们可以给变量自定义各种各样的属性来标示和说明这个变量的某些特定特征。另外由于NCL的函数没有可选参数,经常地我们使用变量的属性来传递一些值作为可能的函数参数扩展方法,以便函数能处理不同的情形。
维¶
维定义了变量所引用数据的形状和大小。与C语言一致,NCL中维是 行*列 来排序的。
通常情况下,维可以编号为 0
到 n-1
,其中的 n
即为数据的
维的数目,如 n
为3,说明是3维数据。变量的维序号是非常重要的,因为NCL允许
每一维可以有对应的名称。后面我们可以看到维是NCL中一个非常出彩的变量特征,因
为它使得坐标下标和命名下标 [*] 成为可能。变量的维通过变量名和感叹号 !
以及维
序号来引用。如 hgt!0
将返回变量 hgt
的第0维的名称。要定义或改变
一个维的名称,使用赋值运算符,下面是一个定义变量维名称的例子:
hgt!0 = "time"
hgt!1 = "lev"
hgt!2 = "lat"
hgt!3 = "lon"
[*] | 这里的下标是一个动词,指的是用坐标值或维名称来做变量的索引和切片 |
坐标变量¶
坐标变量是与所赋值的同名维相同大小的一维数组。这些数组是与同名维中每一个索引一
一对应的坐标值。 当这些数组中的值是单调递增或递减时,可以用于坐标下标。如果不是
单调递增或包含缺测值,坐标下标将失败。与运算符 &
用于引用和赋值坐标变量。
为了给变量的某个维定义坐标变量,该维必须有名称。下面是一个例子:
hgt&time = ispan(0, 6, 1)
hgt&lev = (/1000, 850, 700, 500, 300/)
hgt&lat = fspan(100, 180, 81)
hgt&lon = fspan(0, 40, 41)
字符串引用¶
在上面的属性和坐标变量中,引用它们必须知道它们具体的名称。但是如果在引用时不知道
它们的名称,或者处理多个变量有不同的名称,就无法继续。这时候可以使用字符串引用,
通过美元运算符 $
将字符串变量封闭在其中就可以把字符串变量中的值当作属性
或坐标变量来使用。下面是一个例子
dimnames = (/"time", "lev", "lat", "lon"/)
attnames = (/"_FillValue", "long_name", "units"/)
; 使用字符串变量attnames来引用变量hgt的属性
att0 = hgt@$attnames(0)$
; 判断字符串变量dimnames是否是hgt的坐标变量,并引用
if(iscoord(hgt, dimnames(0))
coord0 = hgt&$temperature!0$
end if