停止有脾气的条件检查

时间:2019-05-09 11:49:21

标签: python performance numpy

我需要你的帮助。我想遍历三维数组,并在一个方向上检查两个元素之间的距离,如果较小,则该值应为True。一旦距离大于某个特定值,该维度中的其余值应设置为False。

以下是一维示例:

    a = np.array([1,2,2,1,2,5,2,7,1,2])
    b = magic_check_fct(a, threshold=3, axis=0)
    print(b)

   # The expected output is :
   > b = [True, True, True, True, True, False, False, False, False, False]

为进行简单检查,使用a <= threshold的结果应该是预期的输出,而不是预期的输出:

   > b = [True, True, True, True, True, False, True, False, True, True]

使用numpy是否有一种有效的方法?这件事对性能至关重要。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

一种方法是沿该轴使用np.minimum.accumulate-

np.minimum.accumulate(a<=threshold,axis=0)

样品运行-

In [515]: a
Out[515]: array([1, 2, 2, 1, 2, 5, 2, 7, 1, 2])

In [516]: threshold = 3

In [518]: print np.minimum.accumulate(a<=threshold,axis=0)
[ True  True  True  True  True False False False False False]

另一个具有阈值,然后切片的1D数组-

out = a<=threshold
if ~out.all():
    out[out.argmin():] = 0

答案 1 :(得分:0)

这是使用1st discrete difference的另一种方法:

In [126]: threshold = 3
In [127]: mask = np.diff(a, prepend=a[0]) < threshold

In [128]: mask[mask.argmin():] = False

In [129]: mask
Out[129]: 
array([ True,  True,  True,  True,  True, False, False, False, False,
       False])