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

计算Python中多维数组中达到或超过阈值的次数,python,arrays,numpy,multidimensional-array,percentage,Python,Arrays,Numpy,Multidimensional Array,Percentage,我有一个numpy数组,它是从一个netCDF文件中引入的,它的形状是(930360720),它被组织为(时间、纬度、经度) 对于930个时间戳中的每个lat/lon对,我需要计算值满足或超过阈值“x”(如0.2或0.5等)的次数,并最终计算在每个点超过阈值的百分比,然后输出结果,以便以后可以绘制它们 我尝试了许多方法,但以下是我最近的一次: lat_length = len(lats) #where lats has been defined earlier when unpacked f

我有一个numpy数组,它是从一个netCDF文件中引入的,它的形状是(930360720),它被组织为(时间、纬度、经度)

对于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()函数的时候吗?计算超出阈值的次数然后计算百分比的最有效方法是什么?

啊,看,另一位气象学家

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

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

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

n_good = ice.count(axis=0)
这将返回一个包含好点数的二维数组。然后,您可以通过从
ice.shape[0]
中减去
n\u good
来计算坏数:

n_bad = ice.shape[0] - n_good
并使用以下公式计算不良的百分比:

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

有很多方法可以做到这一点,而无需使用
MaskedArray
。这是我想到的最简单的方法。

您可以将输入的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])

您是要计算整个数组中超过阈值的总次数,还是要计算每个时间戳的总次数。i、 e您是在寻找单个数字,如100倍或930倍,因此时间戳1超过5倍,时间戳2超过10倍,依此类推。每个lat/lon的总次数(因此循环中的i和j对),因此最终输出将生成一个形状数组(720360)而每一个点都会容纳超过的次数。这有助于更好地澄清问题吗?你的回答让我意识到我对这个问题的思考有多么严重。@Vorticity啊,别担心!发生在我们最好的人身上!:)
# 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])