【问题标题】:Counting the number of times a threshold is met or exceeded in a multidimensional array in Python计算Python中多维数组中达到或超过阈值的次数
【发布时间】:2016-03-23 07:34:46
【问题描述】:

我有一个 numpy 数组,它是从 netCDF 文件中引入的,其形状为 (930, 360, 720),其组织形式为 (时间、纬度、经度)。

在每个 930 个时间戳的每个纬度/经度对上,我需要计算该值达到或超过阈值“x”(例如 0.2 或 0.5 等)的次数并最终计算百分比在每个点都超过阈值,然后输出结果以便稍后绘制。

我尝试了很多方法,但这是我最近的方法:

lat_length = len(lats) 

#where lats has been defined earlier when unpacked from the netCDF dataset

lon_length = len(lons) 

#just as lats; also these were defined before using np.meshgrid(lons, lats)

for i in range(0, lat_length):
     for j in range(0, lon_length):
          if ice[:,i,j] >= x:
               #code to count number of occurrences here
               #code to calculate percentage here
               percent_ice[i,j] += count / len(time) #calculation 

 #then go on to plot percent_ice

我希望这是有道理的!我将不胜感激任何帮助。我是用 Python 自学的,所以我可能会遗漏一些简单的东西。

现在是时候使用 any() 函数了吗?计算超出阈值的次数然后计算百分比的最有效方法是什么?

【问题讨论】:

  • 您是要计算整个数组中超过阈值的总次数还是每个时间戳的总次数。即您是在寻找一个数字,例如 100 次还是 930 个数字,所以在时间戳 1 上超过 5 次,在时间戳 2 上超过 10 次,依此类推。
  • 每个纬度/经度的总次数(因此循环中的 i 和 j 对),因此最终输出将产生一个形状数组 (720, 360),每个点将保持超过的次数。这是否有助于更好地澄清它?

标签: python arrays numpy multidimensional-array percentage


【解决方案1】:

啊,看,另一个气象学家!

可能有多种方法可以做到这一点,我的解决方案不太可能是最快的,因为它使用了 numpy 的 MaskedArray,众所周知这很慢,但这应该可以:

Numpy 有一个称为MaskedArray 的数据类型,它实际上包含两个普通的numpy 数组。它包含一个数据数组和一个布尔掩码。我会首先屏蔽所有大于或等于我的阈值的数据(使用np.ma.masked_greater() 表示大于):

ice = np.ma.masked_greater_equal(ice)

然后,您可以使用ice.count() 通过指定您要沿特定轴计数来确定每个纬度/经度点有多少值低于您的阈值:

n_good = ice.count(axis=0)

这应该返回一个包含好点数的二维数组。然后你可以通过从ice.shape[0] 中减去n_good 来计算坏的数量:

n_bad = ice.shape[0] - n_good

并使用以下方法计算错误的百分比:

perc_bad = n_bad/float(ice.shape[0])

有很多方法可以在不使用MaskedArray 的情况下做到这一点。这只是我想到的简单方法。

【讨论】:

    【解决方案2】:

    您可以将输入 3D 数组与阈值 x 进行比较,然后沿第一个轴与 ndarray.sum(axis=0) 求和,以获取计数和百分比,如下所示 -

    # Calculate count after thresholding with x and summing along first axis
    count = (ice > x).sum(axis=0)
    
    # Get percentages (ratios) by dividing with first axis length
    percent_ice = np.true_divide(count,ice.shape[0])
    

    【讨论】:

    • 你的回答让我意识到我对这个问题的考虑是多么严重。
    • @Vorticity 啊,别担心!发生在我们最好的人身上! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 2014-02-17
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多