爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
楼主: 贫道敬孔

[经验总结] 【重磅】用NCL的思想理解Python【持续更新】

[复制链接]

新浪微博达人勋

 楼主| 发表于 2024-6-4 17:19:53 | 显示全部楼层
由于python对多维数组是“包前不包后”的,所以,在循环的时候,比如要循环的是1-30天,nday=30,
那么NCL是do i= 0 , nday-1
而python则是for day in range(0, nday):
python这里千万不能nday-1,否则程序不报错,也能正常运行,但是出来的数据都是相等的常数,自然就是错的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-6-15 14:40:29 | 显示全部楼层
我喜欢用ds.time.dt.month.isin([])选取时间,切片后的dataArray,time维同样是datetime64格式的
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-6-16 02:28:48 | 显示全部楼层
puck66 发表于 2024-6-15 14:40
我喜欢用ds.time.dt.month.isin([])选取时间,切片后的dataArray,time维同样是datetime64格式的

可以可以,学习一个
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-6-16 22:28:22 | 显示全部楼层
贫道敬孔 发表于 2024-6-16 02:28
可以可以,学习一个

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-7-3 22:32:03 | 显示全部楼层
本帖最后由 贫道敬孔 于 2024-7-8 16:33 编辑

继续更新

对于扩充维度还有两种方法很方便:

import numpy as np

# 假设有一个三维数组 v
v = np.random.rand(30, 145, 288)

# 对数组进行求和操作
v_sum = np.sum(v, axis=0)
print("Shape of v_sum:", v_sum.shape)

# 将二维数组扩展回三维数组,其中第三维的大小是1
v_expanded = np.expand_dims(v_sum, axis=0)
print("Shape of v_expanded:", v_expanded.shape)     
最通用,首页第3条就是

# 或者使用 reshape 方法
v_expanded_reshape = v_sum.reshape(1, 145, 288)  

print("Shape of v_expanded_reshape:", v_expanded_reshape.shape)

当且仅当v_sum本身是(145, 288)才可以使用,因为不改变其“总值”——python中扩充维度的总思想是所有维度的乘积不变的情况下才能扩充!

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-7-9 16:43:22 | 显示全部楼层
继续更新

python中显示非nan值得最大值和最小值得方法:

non_nan_rp = rp[~np.isnan(rp)]
max_rp = np.nanmax(non_nan_rp)
min_rp = np.nanmin(non_nan_rp)
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-7-9 16:47:38 | 显示全部楼层
继续更新

python的加减可以是不同维度,但乘除一定得要相同维度,此时扩维用之前介绍的方法就行。

NCL的加减乘除都必须是相同维度,差一维可以用循环,但是差二维以上还是建议用扩维来计算,要快很多。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-7-9 18:25:23 | 显示全部楼层
继续更新

将0换为缺测值

python:
chushu = np.where(chushu == 0, np.nan, chushu)

NCL:
chushu = where(chushu.eq.0, S_xy@_FillValue, chushu)
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-7-18 21:32:27 | 显示全部楼层
python的几大坑:

1、使用np.std时,一定要在括号的最后有, ddof=1,否则会出现后续计算错的离谱比如相关系数大于1的情况,尤其是序列比较短的时候

2、用matplotlib画图时,如果有填色图ax.contourf再叠加等值线ax.contour,最好将经纬度的范围、以及填色变量和等值线变量的经纬度范围提前都定义好,这样就不会出现等值线范围叠加错误的情况,目前这种情况无论是调
pcproj_180 = ccrs.PlateCarree(central_longitude=180)
还是调pcproj     = ccrs.PlateCarree(),
还是调ax.set_extent( [0, 140, 17, 73], crs=pcproj )
或是调ax.set_xticks(np.arange(0,160,20), crs = pcproj )
    ax.set_yticks(np.arange(20,75,10), crs = pcproj )
都不可以使二者“自动”叠加出正确的目标范围。
所以有这种叠加的情况时经纬度和目标变量们就不要用全球的了(这里NCL胜,只要地图定义目标范围,变量就不用单独设置)。

当然,为了定位方便,使用本帖最开始的给变量赋予经纬度的属性的方法就可以方便地使用.sel选择范围,而不是傻乎乎地数格点。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-7-18 21:53:10 | 显示全部楼层
有趣有趣,看标题惊艳了我
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表