介绍

还是想为地理学和古气候学做点力所能及的事情,那还是说说这段时间学习的东西和做过的一些小demo。(不会涉及到工作的代码,所有内容都是重新写的。)

随着传感器的自动化发展,未来气候数据会越来越多。加上深度学习对气候数据的使用,这种处理大规模数据的手段我认为是必须要掌握的。

这个系列大概2周一更(估计),不一定,看情况。

我想着从Python和JavaScript两方面来慢慢说。Python会偏向于现有的数据的处理和科研用图,最后可能会讲到深度学习。JS则偏向于三维的地理数据展示。

还是要一定基础的,Python这边建议看廖雪峰的,大概看到类和第三方库附近应该大概就能懂了:

JS的之后再说吧。

另外就是我的算法很菜,很多也不是最优解,不要吐槽我复杂度超高的算法,麻烦了!

第一课:文本数据处理

先给出这课的代码(可能要特别的上网方式,可以联系我的微信和email,我也可以给。以后看情况在我网站上给出吧):

可以的话在github上给个星哦,谢谢~

古气候中常用的HadiSST,在官方网站是以文本给出的:

epson lq 630k 恢复 缺省 配置_缺省值_什么是缺省

(其实在NOAA给的是netCDF,那更好用)

我以前不会编程的时候,直接在Excel里用分列的方法把这些数据提了出来。很慢而且很苦。

这个文件还非常不规范,一是它不是正确的换行方法,一般来说是以”rn”来作为行尾的,再就是缺省值“-32768″竟然之间又没有空格。所以就很麻烦。这里就说说思路吧:

第一就是要下载文件了,网站上给的”.gz”文件,解压出来是一个文本文件,你可以以任何名字命名它,我这里就以”view_temps_output_data.data”来重命名它(我自己也重命名了格式,都可以,对得上名字就行)。然后放在与 python脚本 相同的文件夹下。放到哪都行,下面的路径对应上就行。我这里下载了2004年的,只有12个月的数据(我的代码中是没有数据的,要自己下载!):

第二部就是打开它并读取它了:

with open("./view_temps_output_data.data","r") as f:#需要把文件路径替换成你解压之后的地方    data = f.read()
data_splited = data.split('n')

现在 data_splited 就是分好行的一个list。这里行数以数组序号为准,从第0行开始。第0行是第1个月的日、月、年和行数列数介绍,之后1-180行就是从北纬90-南纬90。第181行就是第2个月的介绍了,之后180行以此类推。

然后我们可以一些信息来看看,其中特别是其中某行

print(len(data_splited))#2173,是因为180个纬度*12个月+12个月的说明+1行空行(在最后)=2173print("第一行:", data_splited[0])#每个月的说明     1     1  2004   180 rows    360 columnsprint("最后一行:", data_splited[-1])#最后一行是个空的print(data_splited[1])# -1000 *360,也就是经度#这是北纬90度,-10是因为HadiSST测量的海表温度的最低值是-10摄氏度。这代表着北纬90度的有360个-10度的数据。其从哪里开始可以看官网说明https://www.metoffice.gov.uk/hadobs/hadisst/data/Read_instructions_sst.txt,从180W开始的。

除了介绍行,其他行数全是没分列的温度,一共有360个数据。这对应着从西经180度到东经180度的温度。

因为想要得到纯粹的温度数据缺省值,以供未来画图,那我们要干2件事:1.把介绍行给分到另外的list里(不要也行),2.把温度数据正确分列,有很多种方法,一是利用build in的list。也可以用for和if组合。也能利用高阶函数filter来做。这里就用了第一种来试试:

print([x for x in data_splited[1].split(" ") if x !=""])#使用build in去除掉""即可print(len([x for x in data_splited[1].split(" ") if x !=""]))#360,这是正确的

通过build in的list(会更快),就可以分列并排除掉空值了。这里刚好得到我们其中一个纬度的360个经度的数据了。

接下来好办,一个月肯定有180行海表温度数据,把这180行归到一个list里,就可以得到一个维度是[1,180,360]的数据。这里的核心问题有2个,1个是怎么去除掉 介绍 行呢?还有就是有另一个问题,-32768它没有空格,还要给这种行数据处理下。这里可以用常用的offset来处理缺省值,想象我们是要一月一个月这样的数据,每1个月有181行(含一行介绍行),第1月是0*181到1*181行,第2月是1*181到2*181行,以此类推就可以得到:

months_description = []months_data = []for i in range(int(len(data_splited)/(180+1))):#0-11,因为int会把float强转    one_month_data=[]    one_month_description=""    for j in range(i*(180+1),(i+1)*(180+1)):        if j % (181) !=0:            temp = data_splited[j].replace("-32768"," -32768") #-缺省值32768没有空格,所以会出问题,给所有出现-32768的加一个空格            temp = [float(x) for x in temp.split(" ") if x !=""]#根据上面的进行分行            one_month_data.append(temp)        else:            one_month_description=data_splited[j]    months_data.append(one_month_data)    months_description.append(one_month_description)

(其实上面的replace能合并在一起的,这样写更清楚,就是浪费了性能)这里可以用整除181是不是等于0来看是不是介绍行。把介绍行分到了months_description里,而把数据分到了months_data里。

最后我们可以用numpy来看看是不是正确的(看”for_numpy.py”,要下载第三方库哦)

    np_data = np.array(months_data)    print(np.shape(np_data)) #(12, 180, 360)  

可以看到这形状正是12*180*360。也就是我们需要的数据了。你就可以开心地对这些数据进行提取部分区域然后进行加减了。可以用slice获取一个区域的数值,计算平均值之后减去另一个区域的。这就是各种尼诺指数的计算方法。

另外,这种形状有什么用呢?

现代的视觉算法当中,最常用的卷积运算就是多通道的运算。在遥感当中,我们会使用红绿蓝红外几个波段,其实就是 通道数*高*宽。在卷积神经网络中,这就是我们的原始数据。

第一课就讲到这吧。具体多看看理解代码,这里只是稍微讲讲~

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688