【问题标题】:Covariance Matrix Python - Omit -9999 Value协方差矩阵 Python - 省略 -9999 值
【发布时间】:2015-04-05 11:50:55
【问题描述】:

我正在尝试使用 python 计算两个完全重叠的图像的协方差矩阵。相同的代码是:

stacked = np.vstack((image1.ravel(),image2.ravel()))
np.cov(stacked)
  • 使用此方法的问题是,有时图像可能包含 NoData 值,例如 -9999,表示像素值不存在。在这种情况下,np.cov 仍然会考虑导致图像均值剧烈变化的值,从而给出错误的协方差输出。

  • 如果我尝试删除 NoData,则会出现维度问题,其中两个图像的维度不同,因此无法计算协方差矩阵。

  • 手动计算会非常耗时

是否有克服 NoData 问题并正确计算协方差矩阵的价值?

【问题讨论】:

    标签: python image numpy matrix no-data


    【解决方案1】:

    您最好的选择是使用 numpy 的掩码数组提供的方法,其中之一是在存在掩码项时计算协方差矩阵:

    >>> import numpy as np
    >>> mask_value = -9999
    >>> a = np.array([1, 2, mask_value, 4])
    >>> b = np.array([1, mask_value, 3, 4])
    >>> c = np.vstack((a,b))
    >>> 
    >>> masked_a, masked_b, masked_c = [np.ma.array(x, mask=x==mask_value) for x in (a,b,c)]  # note: testing for equality is a bad idea if you're working with floats. I'm not, these are integers, so it's okay.
    >>> 
    >>> result = np.ma.cov(masked_c)
    >>> result
    masked_array(data =
     [[2.333333333333333 4.444444444444445]
     [4.444444444444445 2.333333333333333]],
                 mask =
     [[False False]
     [False False]],
           fill_value = 1e+20)
    
    >>> np.cov([1,2,4]) # autocovariance when just one element is masked is the same as the previous result[0,0]
    array(2.333333333333333)
    

    根据你调用np.ma.cov的方式,结果会有所不同:

    >>> np.ma.cov(masked_a, masked_b)
    masked_array(data =
     [[4.5 4.5]
     [4.5 4.5]],
                 mask =
     [[False False]
     [False False]],
           fill_value = 1e+20)
    
    >>> np.cov([1,4])  # result of the autocovariance when 2 of the 4 values are masked
    array(4.5)
    

    原因是后一种方法结合了两个变量的掩码,如下所示:

    >>> mask2 = masked_c.mask.any(axis=0)
    >>> all_masked_c = np.ma.array(c, mask=np.vstack((mask2, mask2)))
    >>> all_masked_c
    masked_array(data =
     [[1 -- -- 4]
     [1 -- -- 4]],
                 mask =
     [[False  True  True False]
     [False  True  True False]],
           fill_value = 999999)
    
    >>> np.ma.cov(all_masked_c) # same function call as the first approach, but with a different mask!
    masked_array(data =
     [[4.5 4.5]
     [4.5 4.5]],
                 mask =
     [[False False]
     [False False]],
           fill_value = 1e+20)
    

    所以请使用np.ma.cov,但请注意当存在不重叠的掩码值时您希望如何解释数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 2020-04-13
      相关资源
      最近更新 更多