爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 40602|回复: 25

[求助] Python-序列与变量场相关系数计算对缺测值NAN的处理

[复制链接]

新浪微博达人勋

发表于 2020-7-11 00:27:28 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
https://www.yxybiubiubiu.com/2020/05/19/f1-1-3-1/ 利用大佬的代码计算序列与变量场的相关系数时遇到问题:比如序列或者变量场会存在缺测值NAN,导致程序无法继续运行。我想能否添加代码,使程序在运行中跳过或者忽略NAN值的部分,试了网上的一些方法没成功,希望有经验的朋友赐教!下面附上大佬网站上的代码:
  1. import numpy as np
  2. from scipy.stats import pearsonr
  3. from numba import jit
  4. @jit
  5. def escorc(x,y,opt):
  6.     if opt==1:
  7.         r,p = pearsonr(x,y)
  8.     elif opt ==2:
  9.         lat = y.shape[1]
  10.         lon = y.shape[2]
  11.         r,p = np.zeros((lat,lon)),np.zeros((lat,lon))
  12.         for i in range(lat):
  13.             for j in range(lon):
  14.                 r[i,j],p[i,j] = pearsonr(x,y[:,i,j])
  15.     return r,p
复制代码


密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-7-11 09:34:48 | 显示全部楼层
首先简述一下Python中布尔(bool)逻辑数的计算规则,他是可以进行加运算和乘运算的,分别对应或运算以及且运算的,比如:
False+False=False       False+True=True       True+True=True
False*False=False       False*True=False       True*True=True
这是因为Python中False是0,而非零数视为True,所以可以进行以上运算的。

下面开始讲实际问题,其实楼主的想法就是把两个序列中互不为nan的的地方挑出来,然后做皮尔森相关。
那首先是判断一个numpy数组中的每个元素是否是nan,这个用nump.isnan函数,比如:
  1. import numpy as np

  2. a=np.array([1,2,np.nan,4,np.nan,6,7,8,9,0])
  3. b=np.array([1,np.nan,3,4,np.nan,6,7,8,np.nan,0])

  4. print(np.isnan(a))
  5. print(np.isnan(b))
复制代码

输出的结果为:
  1. [False False  True False  True False False False False False]
  2. [False  True False False  True False False False  True False]
复制代码

可以看到为nan的地方为True,在存在有效值的位置书False,这时候可以使用非运算符(not或者~),取反事件:
  1. print(~np.isnan(a))
  2. print(~np.isnan(b))
复制代码

结果:
  1. [ True  True False  True False  True  True  True  True  True]
  2. [ True False  True  True False  True  True  True False  True]
复制代码


利用最开始说的计算规则,将两个布尔数组做且运算,也就是乘运算。
  1. notnan=~np.isnan(a) * ~np.isnan(b)
复制代码

结果:
  1. [ True False False  True False  True  True  True False  True]
复制代码

这时候这个notnan中的True的位置,都是a和b数组中均不为nan的地方。

最后使用这个notnan的布尔数组分别对a和b数组进行broadcast取数:
  1. print(a[notnan])
  2. print(b[notnan])
复制代码

结果:
  1. [1. 4. 6. 7. 8. 0.]
  2. [1. 4. 6. 7. 8. 0.]
复制代码


另外numpy有一个zeros_like函数,你这个r和p零矩阵生成的时候,直接可以这样:
  1. r,p = np.zeros_like(y),np.zeros_like(y)
复制代码

就不用再去用shape折腾出原来矩阵的大小,然后再来生成了....

评分

参与人数 1金钱 +20 收起 理由
D_Fora + 20 赞一个!

查看全部评分

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

使用道具 举报

新浪微博达人勋

发表于 2021-11-26 14:27:38 | 显示全部楼层
scipy.stats.spearmanr或者可以用这个,我也不确定,但是这个他自己好像可以忽略nan
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2020-7-11 10:03:29 | 显示全部楼层
学习python,天天向上
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-7-11 11:29:22 | 显示全部楼层
Masterpiece 发表于 2020-7-11 09:34
首先简述一下Python中布尔(bool)逻辑数的计算规则,他是可以进行加运算和乘运算的,分别对应或运算以及且运 ...

非常感谢您的详细指教,我去尝试一下,有问题再来请教
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-7-11 19:14:00 | 显示全部楼层
本帖最后由 Tao_Xu 于 2020-7-11 22:25 编辑
Masterpiece 发表于 2020-7-11 09:34
首先简述一下Python中布尔(bool)逻辑数的计算规则,他是可以进行加运算和乘运算的,分别对应或运算以及且运 ...

再次请教,因为我计算的数据,分别是一维的序列和三维的nc数据,所以做且运算时出现错误“operands could not be broadcast together with shapes (31,721,1440) (31,)”,不知道怎么解决
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-7-11 19:29:33 | 显示全部楼层
Tao_Xu 发表于 2020-7-11 19:14
再次请教,因为我计算的数据,分别是一维的序列和三维的nc数据,所以出现错误“operands could not be br ...

可以.reshape(31,1)
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-7-12 11:31:52 | 显示全部楼层

能仔细说说嘛?没试成功
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-7-12 11:39:19 | 显示全部楼层
Tao_Xu 发表于 2020-7-11 19:14
再次请教,因为我计算的数据,分别是一维的序列和三维的nc数据,所以做且运算时出现错误“operands could ...

你是想做什么运算?直接拿三维数组和一维数组
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-7-12 12:05:00 | 显示全部楼层
Masterpiece 发表于 2020-7-12 11:39
你是想做什么运算?直接拿三维数组和一维数组

最终目的是为了做两组数据(一维和三维数组)的相关系数的空间分布图,我这里遇到的问题是在进行且运算选取非NAN值的时候出错了,问题应该是出在维度不同不能进行计算
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-7-13 19:49:34 | 显示全部楼层
自己顶一下
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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