3.
\ begingroup美元

我有一个海洋表面温度时间序列,我想计算热带地区(30.0N到30S)节点之间的(Pearson)相关系数。在时间序列中,土地信息被掩盖。我不知道在相关性计算中如何处理蒙面数据。请帮助。我在这里使用的数据在这个链接中https://drive.google.com/file/d/1SVKQ4uBDEZOuN7_ftd5tqpF9_NGKY3pZ/view?usp=sharing

我尝试了下面的代码,但没有工作:

Temp5 = 'sst.day.mean.1983。fh5 =数据集(temp5, mode = 'r') sst5 = fh5。变量['sst'][:365] time = fh5。变量['time'][:] lat = fh5。变量['lat'][210:510][::35] #热带纬度lon = fh5。变量['lon'][::45] mar_05=[] for I in range(len(lat)): for j in range(len(lon)): for m in range(len(lat)): for n in range(len(lon)): mar_05.append(np。corrcoef (sst5 [59:90, i, j], sst5 [59:90, m, n] [0,1])) df = pd。DataFrame(data = mar_05)
\ endgroup美元
5
  • \ begingroup美元 我试过np.ma.corrcoeff而不是np。corrcoef,但仍然,相关表是NAN。有什么可行的解决方案吗? \ endgroup美元
    - - - - - -Ruby
    3月5日19:52
  • \ begingroup美元 你的数据在吗sst5NaN值,包括被屏蔽的元素? \ endgroup美元
    - - - - - -Deditos
    3月7日9点31分
  • \ begingroup美元 @Deditos数据中没有NAN值;只有被屏蔽的值存在。 \ endgroup美元
    - - - - - -Ruby
    3月7日11:48
  • \ begingroup美元 @Deditos谢谢你的建议,但我的问题还在。我使用了NOAA SST,并定义了感兴趣的纬度(lat = fh5.variables['lat'][210:510][::35])。纬度范围为回归线[-37.375 -28.625 -19.875 -11.125 -2.375 6.375 15.125 23.875 32.625]。在纬度范围内,陆地面积被掩盖,海洋数据是可用的。我试着计算节点之间所有可能的相关值,所以嵌套循环。我也用ma。Corrcoef代替np。corrcoef,但相关列表只包含NAN值。 \ endgroup美元
    - - - - - -Ruby
    3月8日13:12
  • \ begingroup美元 你的行lat =而且朗=不要做你认为他们会做的事。当你引用时,它们不会设置轴的哪些部分是活动的/可见的sst5他们只是列出你感兴趣的拉特和隆,但是sst5对里面的内容一无所知。我会修改我的答案。 \ endgroup美元
    - - - - - -Deditos
    3月8日16:26

1回答1

1
\ begingroup美元

我猜你用的是NOAA OISST数据,尽管我不认为这对这里的答案有什么影响。

注意你的循环,

For I in range(len(lat)): For j in range(len(lon)): For m in range(len(lat)): For n in range(len(lon)):

会生成索引,

I = 0,…,8 j = 0, ..., 31 m = 0, ..., 8 n = 0, ..., 31

将全局SST数组子集sst5 (59:90, i, j)而且sst5 (59:90, m, n)你不是在从你的热带点提取数据纬度而且变量,你只是从完整的全局数组的角落提取数据,即,Sst5 [:, 0:8, 0:31].你可以通过打印出来看到这一点sst5.shape在循环中,会显示,

...(365, 720, 1440)(365, 720, 1440)(365, 720, 1440)(365, 720, 1440)…

这个角在南极洲,因此没有海表温度数据numpy.corrcoef将只看到缺失的数据值,并试图除以零协方差,产生NaN值。当发生这种情况时,我的Numpy会发出以下警告:

RuntimeWarning:在true_divide c /= stddev[:,无]中遇到的无效值

您可以修改您的程序以子集sst5循环之前的数组:

sst5_子集= sst5[59:90, 210:510:35,::45]

然后引用循环中的这个数组:

mar_05.append (np。corrcoef (sst5_subset (:, i, j), sst5_subset (:, m, n)) [0,1])

但是,就我个人而言,我会去掉循环,把它作为一个整个数组的操作来做:

Sst_array = sst5_子集。形状[0],1)。T corr = np.ma.corrcoef(sst_array)

一个兴趣点的快速输出图片:在这里输入图像描述

\ endgroup美元
1
  • 1
    \ begingroup美元 谢谢你的方便回复,它把我从嵌套循环中拯救了出来。之前,我计算了地球仪的相关性,没有实现lat = [..和lon =[]在嵌套循环条件中没有实现目的。谢谢你让我意识到我犯的错误。 \ endgroup美元
    - - - - - -Ruby
    2天前

你的答案

点击“张贴您的答案”,即表示您同意我们的服务条款隐私政策而且饼干的政策

这不是你想要的答案?浏览带标签的其他问题问自己的问题