根据阈值变化在np数组中筛选值的最快方法

美丽的

我想arr基于一些阈值来过滤数组

arr = np.array([2,2,2,2,2,5,5,5,1])
thresholds = np.array([4,1])

我想arr根据in中thresholds的值arr大于阈进行过滤

我的想法是为每个阈值创建一个蒙版

预期结果:

# [[False False False False False  True  True  True False]
#  [ True  True  True  True  True  True  True  True False]]

在Python中执行此操作的一种方法:

mask = [True if x>condi else False for condi in thresholds for x in arr]
mask = np.reshape(mask,(2,9))

然后获得仅由滤波阵列filteredarr = arr[mask[i]]这里i是相关的阈值的指数

有没有更好的方法(性能明智)在Python中执行此操作?特别是我正在处理大型数组(arr大约为250000,没有特定的len thresholds,但是我期望大型数组)?

编辑:预期在数据上的最终输出是[array([5, 5, 5]), array([2, 2, 2, 2, 2, 5, 5, 5])]

庞塞

可以使用以下方法轻松获得面膜

mask = arr[None,:]>thresholds[:,None]
mask

# Output
# array([[False, False, False, False, False,  True,  True,  True, False],
#        [ True,  True,  True,  True,  True,  True,  True,  True, False]], dtype=bool)

这个想法是通过使用添加一个附加轴None(与相同np.newaxis)来扩大维数,然后逐个元素比较数组。

一旦有了掩码,我们就可以使用各种方法来过滤数据,其中选择很大程度上取决于您的问题:

  • 当然可以

    res = [arr[m] for m in mask]
    # [array([5, 5, 5]), array([2, 2, 2, 2, 2, 5, 5, 5])]
    

    为了获得包含过滤数据的列表,但通常速度较慢。

  • 如果您需要进一步的数值计算,我将创建一个masked array仅考虑过滤数据的:

    m = np.zeros_like(mask).astype(np.int)
    m[:] = arr
    res = np.ma.masked_where(~mask,m)
    

    现在,每行都根据相应的阈值对应于过滤后的数据。带掩码的数组使您可以继续使用许多功能,例如meanstd

    res.mean(axis=1)
    # masked_array(data = [5.0 3.125],
    #             mask = [False False],
    #       fill_value = 1e+20)
    
    res.mean(axis=1).compressed()
    # array([ 5.   ,  3.125])
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章