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

4
我有一个从netCDF文件中导入的numpy数组,形状为(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()函数的时候?最有效的方法是计算超过阈值的次数,然后计算百分比是什么?


1
你想要计算整个数组中阈值被超过的总次数还是每个时间戳的总次数?比如,你是想要一个单独的数字,像100次或930个数字,这样它在时间戳1上被超过了5次,在时间戳2上被超过了10次,以此类推。 - jfish003
每个经纬度点处的总次数(因此在循环中使用 i 和 j),因此最终输出将导致形状为(720,360)的数组,并且每个点将保存超过此值的次数。这有助于更好地澄清吗? - wxgirl1031
2个回答

4

您可以将输入的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
@Vorticity 不用担心!最好的人也会犯错! :) - Divakar

3

啊,看,又来了一个气象学家!

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

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

ice = np.ma.masked_greater_equal(ice)

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

n_good = ice.count(axis=0)

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

n_bad = ice.shape[0] - n_good

使用以下方法计算坏设备的百分比:

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

有很多方法可以在不使用MaskedArray的情况下完成这个操作。这只是我想到的一种简单的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接