NCL官网(http://www.ncl.ucar.edu/)有NCL-to-Python Transition Guide,喜欢看原版的可以自行下载或在线阅读:
http://www.ncl.ucar.edu/Document/Manuals/NCL_to_Python/Transition_Guide_NCL_PyNGL.pdf
下面是我对该用户手册的翻译。其实现在各类翻译软件发展迅猛,付费用户可以直接上传.pdf文件,机器可以快速翻好,其后人工再作一些修改即可。可惜,我不是付费用户,所以还是自己翻吧。。
NCL -> Python用户手册V1.1
宗培书(译) 2019.02.14
1、引言
对于大多数NCL用户来说,从NCL转向Python可能是一个重大的跨越,需要花费大量的时间。本手册旨在帮助用户减轻过渡时期的困难,缓解新语言的使用所带来的焦虑。
本手册第一部分提供了NCL和Python语言特性的比较表,第二部分包含NCL和Python的相对应的常用数学函数。
接下来的两个部分为 NCL和Python读写ASCII和NetCDF文件的示例。
手册的其余部分包含一些用NCL和Python编写的图形示例,其中Python 脚本绘图时使用PyNGL模块。
NCL和Python脚本的对应表中,左侧一列为NCL脚本,右侧为相应的Python脚本。逐行比较脚本,可以发现二者之间的差异并没有想象中那么巨大。
本手册中的许多例子可以在NCL官网上找到:
http://www.ncl.ucar.edu/Applications/NCL_to_Python/
本手册中还有一些例子,使用的是xarray而不是PyNIO。如果想要使用PyNIO,可以在被注释的部分找到相应代码。
要运行示例脚本,最简单的方法是使用conda。Miniconda的下载地址为:
https://conda.io/en/latest/miniconda.html
(阿宗按:conda是一种通用包管理系统,旨在构建和管理任何语言和任何类型的软件。举个例子:包管理与pip的使用类似,环境管理则允许用户方便地安装不同版本的python并可以快速切换。
Anaconda是一个打包的集合,里面预装好了conda、某个版本的python、众多packages、科学计算工具等等,就是把很多常用的不常用的库都给你装好了。
Miniconda,顾名思义,它只包含最基本的内容——python与conda,以及相关的必须依赖项,对于空间要求严格的用户,Miniconda是一种选择。就只包含最基本的东西,其他的库得自己装。
其实我个人推荐下载安装Anaconda,尤其是服务器用户,Anaconda会给你省去很多麻烦。Anaconda的下载安装,以及PyNIO和PyNLG的安装方法见本公众号旧文:
如何优雅地告别NCL
)
安装完成conda后,可以使用conda来安装所有需要的包。建议将这些软件包安装到一个单独的环境中:
conda create -n ncl_to_python -c conda-forge xarray netcdf4 scipy pyngl pynio ncl
source activate ncl_to_python
(阿宗按:有人反馈过这种方法安装netcdf4后,import netcdf4时会报错。因此这里提供另外一种安装netcdf4的方法:
对于Windows用户:
1、在Anaconda Prompt(开始菜单栏,Anaconda3文件夹下)输入命令:conda update --all
2、运行完成后,安装netCDF4模块:conda install netCDF4
对于Linux用户:
直接在命令行输入 conda update --all,运行完成后再输入conda install netCDF4,即可。在这里,Anaconda用户可以顺带手把深度学习的常用模块Keras和TensorFlow都安装一下,命令如下:
conda install keras
conda install tensorflow)
本手册示例脚本中所使用的数据文件(包括binary文件、ASCII文件、和NetCDF文件),可以从这里下载:
http://www.ncl.ucar.edu/Document/Manuals/NCL_User_Guide/Data/
最后,NCL脚本和Python脚本的运行方法如下:
NCL: ncl script_name.ncl
PyNGL: python script_name.py
2、NCL与Python语言基础
变量赋值、数组索引、循环和条件语句在NCL和Python中的写法不同,但也有许多相似之处。进行完整的比较会超出本手册的范围,因此只列出了一些比较常用的情况。
要了解更多关于NCL、Python、Xarray、NumPy等的信息,请参见:
NCL相关文件: http://www.ncl.ucar.edu/Document/Python 2.x相关文件: https://docs.python.org/2/index.htmlPython 3.x相关文件: https://docs.python.org/3/Numpy and Scipy: https://docs.scipy.org/doc/ESMPy: https://www.earthsystemcog.org/projects/esmpy/xarray: http://xarray.pydata.org/en/stable/xesmf: https://xesmf.readthedocs.io/en/latest/
NCL和Python脚本写法对比如下:
3、数学函数
Python的模块numpy提供了许多现成的数学函数来计算平均值(averages, means)、最小值(minimum)、最大值(maximum),和一些统计量(statistics)。下面的对比列表不包含所有的函数,只是列出了一些常用的。
想要了解更多的关于NCL和Python的数学模块,可以参见:
NCL:http://NCL.ucar.edu/document/functions/math.shtml
Numpy:https://docs.scipy.org/doc/Numpy-1.13.0/reference/routines.math.html
Python中加载numpy的命令为:
import numpy as np
4、读文件
比较NCL和PyNGL的最好方法是把NCL脚本和PyNGL脚本放在一起,比对着学习。本章将概述二者的差异和类似之处。使用 PyNIO 打开和读取一个文件是直接进入文件进行处理,而不用管是GRIB、HDF还是Netcdf格式。 NCL读取ASCII文件的方法则略有不同,详见4.2。
4.1 读取GRIB, HDF或netCDF格式的文件
分别用NCL和Python创建脚本,实现如下功能:打开一个文件,打印它包含的变量,读取一个变量并打印一些关于该变量的信息。
4.2 读取ASCII文件
通常ASCII文件用于存储可读格式的数据,例如观测资料(站点数据)。ASCII数据文件可以包含按列写入的使用分隔符分隔列的数据(CSV文件),也可以按行写入,或进行其他的组合。因此,在读取文件之前,对文件中的内容进行描述是非常重要的。
假设我们想要读取一些数据,将其存储在一个数组中,打印该数组和一些更多的信息,比如行和列的数量,数值范围和数组形状等。该ASCII文件为Test 6h.csv:
2.00;3.50;5.10;8.20
2.40;3.10;4.80;8.90
2.60;3.70;5.30;10.10
2.75;3.90;5.55;10.25
3.00;4.10;6.05;10.50
代码如下:
下一个例子展示了如何读取包含21361行的ASCII文件。该文件包括一行开头和21360行纬度、经度和温度值。文件名为asc6.txt,可以从 http://ncl.ucar.edu/applications/data/asc/asc6.txt 下载。
纬度 经度 温度 (C)
33.3 76.5 20.3
33.3 76.6 20.3
33.3 76.7 21.5
33.3 76.8 20.0
……
4.3 读取多个文件
当不同时次的同一个变量存储在多个文件中时,NCL和Python的netCDF4包都可以实现读取多个文件。
5、写文件
在很多时候,能够将计算得到的数据保存到新文件中是十分重要的。接下来的两个例子分别比较写netCDF 文件的和写ASCII 文件这两种情况。
5.1 写netCDF文件
假设有一个文件rectilinear_grid_3D.nc,我们需要读取level=0的变量t,并且把它从开尔文转换到摄氏度。然后,我们再将转换后的数据写入一个新的netCDF文件。写netCDF文件的方法有两种,一种是简易版,另一种方法则包含更多细节。二者的区别在于 netCDF文件的元数据。
建议在写入文件之前先定义(或创建)所有维度、变量和属性,这样写变量的效率会高得多。
简易版:
简易版本下,NCL和Python创建的netCDF文件没有差异(可以用命令cdo diff t_degC_ncl_short.nc t_degC_py_short.nc 来查看),但是两个文件的元数据是有差别的:
详细版方法(包括保存和设置元数据):
该方法下生成的两个.nc文件的元数据是一样的:
5.2 写ASCII文件
对于将变量写入ASCII文件,Ncl和PyNGL脚本非常相像。
6、绘图
在绘图方面,NCL和PyNGL的图形设置也有很多相似之处,这也让我们在转用新语言时减少了很多问题。
6.1 地图
绘制地图的一个好的开始是绘制简单的填充地区的地图。这个示例演示了不同投影方法下的地图绘制方式:
绘图结果如下:
6.2 XY-Plot
一个 XY-plot 显示了坐标系中给定数组之间的关系。 第一个例子展示了如何用1D 数据数组x和y创建一个简单的XY-plot。
绘图结果如下:
下面是复杂一点的情况。假设有3个数据数组,我们想用不同的颜色和图例在同一个绘图框架中绘制它们。数据值可以存储在一个数组y中,因为它们对应相同的x值。
绘图效果如下:
6.3 柱状图
柱状图是用与它们的值成正比的矩形条绘制的xy-plot。在NCL中,修改属性@gsnxybarchart*的参数值,用户可以设置柱状图中矩形条的参数。不幸的是,PyNGL没有提供这些资源,我们必须使用函数Ngl.polygon来绘制柱状图。
出图效果如下:
篇幅有限,先翻这么多。用户手册后面的内容我都看了一下,主要包括等值线图、风场流场图、切片图、散点图,以及一些图形的覆盖、mask、绘制多个图形、绘制点线、利用shapefile绘制地图,还有插值等等。没有几句需要翻译的英文,都是硬核代码对比,有需要的话直接找到相应章节学习就好。