NCL学习笔记1:数据读取和选择
安装运行
数据读取和选择
重要资源库
官方文档: http://www.ncl.ucar.edu/Document/
官方邮件列表:http://www.ncl.ucar.edu/Support/email_lists.shtml
非官方论坛:
http://bbs.06climate.com/forum.php?mod=forumdisplay&fid=39 ;http://bbs.lasg.ac.cn/?action-forumdisplay-fid-3
中文指南:https://ncl.readthedocs.io/zh_CN/latest/index.html
入门应用
可以直接从ncl官网Examples开始 https://www.ncl.ucar.edu/Applications/
更具体的语法、函数可以参考NCL_User_Guide和Reference_Manual https://www.ncl.ucar.edu/Document/
安装运行
安装
参照ncl官网 https://www.ncl.ucar.edu/Download/
建议用conda(适用于wsl,linux,mac_x86), sudo/yum(linux), homebrew(mac_x86)
os:由于ncl已经停止更新,暂不支持arm架构,即mac芯片,若一定有这个需求,可以先下载转译版的homebrew,且需重新适配x86_64版的fortran库(总之就是十分麻烦)
运行
-
交互模式COMMAND MODE
ncl
开启ncl命令框
quit
退出 -
批处理模式BATCH MODE
ncl myscript.ncl
运行ncl脚本
ncl myscript.ncl >out
运行脚本并输入结果定向到out文件中
ncl -Q myscript.ncl
禁用版本输出,即禁止输出Copyright(C)...版本号 -
脚本编辑
vscode,下载ncl Extension
基本语法
脚本结构
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" ;加载库文件,6.2.0以上版本包含默认加载文件
;****************************************
; These files are loaded by default in NCL V6.2.0 and newer
; load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
; load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
;****************************************
begin
; this is main body of your code
end
; 代码主体的前后需要有begin,end进行声明
从MATLAB到NCL
MATLAB | NCL | Descriptions |
---|---|---|
% | ; | 注释 |
[start:stride:end] | ispan/fspan | 等差序列 |
nan,zero,... | new | 创建新数组 |
[a,b] | table_attach_columns, | 数组拼接 |
[a;b] | table_attach_rows | 数组拼接 |
write_matrix | 按格式打印数组 | |
' ' | " " | 字符串 |
['a',num2str(1),'b'] | "a"+1+"b" | 字符串拼接 |
reshape(A,[5,2]) | reshape(arr1, (/5, 2/)) | reshape成5行2列 |
A' | transpose(A) | 转置 |
举例
fid="sst.nc"
f=addfile(fid, "r") ;~ netcdf(fid)
;print(f) ~ ncdisp(fid)
;list_filevars(f) ~ ncdisp简略版
var1=f->TEMP ;~ ncread(fid,'zeta'), lon,lat,lev,time [181 64 1 1]
;printVarSummary(var1) ~ ncdisp(fid,'zeta')
; 注意,ncl里的dimensions与matlab相反,一般matlab为lon,lat,lev,time,而ncl则为time,lev,lat,time
x1=var1(:,:,3:11:2,0) ;~ x1=var(1,4:2:12,:,:)
;printVarSummary(x1)
; 注意顺序,以及+1
; x2=x1(0) ~ x2=x1(1)
; x2=x1(start:end:stride) ~ x2=x1(start:stride:end)
; 如果没有start,默认从0开始,如果没有end,默认到结尾,:stride选择性
;******************************************************
; arr1(2:4) 选取arr1数组中第3个-第5个元素
; arr1(1::2) 选取arr1数组中第2个-最后,每隔一个元素选取
; hgt(:15:2, 0, 15, 29) 选取hgt数组中第1个时次-第16个时次每隔一个时次 | 第1层 | 第16个纬度 | 第30个经度的片段
;******************************************************
;选取经度在100-110,纬度在10-25之间的变量
x2=var1(:,:,{10:25},{100:110})
;printVarSummary(x2)
;选取 90-120°E 所有纬度、深度 第1个时次 的部分数据
x3=var({lon| 90:120}, lat| :, level| :, time| 0 )
;选取arr1数组中第2个、第4个、第5个、第6个、第8个、第9个元素组成的新数组
arr1 = ispan(1, 10, 1)
idx = (/1,3,4,5,7,8/)
;print(arr1(idx))
;条件选取,相当于find,isnan,...
a = (/1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5/) ; 定义一维数组
a@_FillValue = 5 ; 将5设置为缺测
valid = ind(ismissing(a)) ; 找到数组a中所有缺测值的位置
a(valid) = 0 ; 将缺测值所在位置元素赋值为0
a(ind(a.ne.0)) = -a(ind(a.ne.0)) * 2 + 1 ; 对所有不等于0的元素操作
; ind: Returns the indices where the input is True.
; .eq. 等于 .ne. 不等于
; .gt. 大于 .ge. 大于等于
; .lt. 小于 .le. 小于等于
; .and. .or. .not. .xor.
主要参考NCL中文指南、汪君老师NCL课程
NCL入门级新手,有理解不到位处望批评指正
本文来自博客园,作者:dan-chen,转载请注明原文链接:https://www.cnblogs.com/dan-chen/p/17174224.html
---------------
小陈的学习历险记