计算Python中多维数组中达到或超过阈值的次数

用户

我有一个numpy数组,它是从netCDF文件中引入的,它的形状是(930,360720),在那里它被组织成(时间,纬度,经度)。在

在930个时间戳的每个lat/lon对上,我需要计算该值满足或超过阈值“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()函数的时候了吗?什么是最有效的方法来计算超过阈值的次数,然后计算百分比?在


已被浏览了1311次
更新日期: 2020-10-28 19:50:25
2 个回答
fefe Tyson

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

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

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

ice = np.ma.masked_greater_equal(ice)

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

^{pr2}$

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

n_bad = ice.shape[0] - n_good

并使用以下方法计算不良百分比:

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

有很多方法可以不使用MaskedArray来完成此操作。这是我想到的最简单的方法。在

评论 - 2020年8月26日 20:54
fefe Tyson

您可以将输入的3D数组与阈值x进行比较,然后用^{}沿第一个轴求和,从而得到计数和百分比,如下-

# 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])
评论 - 2020年8月26日 20:54

最新Python问答

推荐Python问答