熊猫:计算第一个连续的True值

熊猫:计算第一个连续的True值,第1张

熊猫:计算第一个连续的True值 题:

查找第一个连续

True
s的计数
考虑
a

a = np.array([True, True, True, False, True, False, True, True, True, True])

答案1

numpy
:用于
np.logical_and.accumulate
的取反,
a
取之于
False
否,则制成一个遮罩,以消除第一个s的存在(如果它们应该存在)。然后
False
在末尾附加a
,以确保我们没有
True
min。最后,使用
np.argmin
查找第一个最小值。如果找到一个position
3
,它将
3

True
在其之前指示值。

np.argmin(np.append(a[~np.logical_and.accumulate(~a)], False))3

答案2

numba.njit

我想使用它,

numba
这样我就可以循环并确保在需要时可以短路。这个问题肯定会在阵列的早期得到解决。无需无故评估整个阵列中的事物。

from numba import njit@njitdef first_true(a):    true_started = False    c = 0    for i, j in enumerate(a):        if true_started and not j: return c        else: c += j true_started = true_started or j    return cfirst_true(a)3

答案3

numpy
更聪明的使用
argmin
argmax
。我围绕
a
False
然后
argmax
用来找到第一个,
True
然后从那一点开始,
argmin
用来找到之后的第一个
False

注意:
@Divakar在此答案上做了改进,消除了对
np.concatenate
和的使用
if/then/else
。这就把这个已经非常快的解决方案削减了
3

def first_true2(a):    a = np.concatenate([[False], a, [False]])    return np.argmin(a[np.argmax(a):])first_true2(a)3

这些答案有多快?
有关其他定时功能的源代码,请参见@Divakar的答案。

%timeit first_true(a)%timeit np.argmin(np.append(a[~np.logical_and.accumulate(~a)], False))%timeit np.diff(np.flatnonzero(np.diff(np.r_[0,a,0])))[0]%timeit first_True_island_len(a)%timeit first_true2(a)%timeit first_True_island_len_IFELSE(a)a = np.array([True, True, True, False, True, False, True, True, True, True])    1000000 loops, best of 3: 353 ns per loop100000 loops, best of 3: 8.32 µs per loop10000 loops, best of 3: 27.4 µs per loop100000 loops, best of 3: 5.48 µs per loop100000 loops, best of 3: 5.38 µs per loop1000000 loops, best of 3: 1.35 µs per loopa = np.array([False] * 100000 + [True] * 10000)10000 loops, best of 3: 112 µs per loop10000 loops, best of 3: 127 µs per loop1000 loops, best of 3: 513 µs per loop10000 loops, best of 3: 110 µs per loop100000 loops, best of 3: 13.9 µs per loop100000 loops, best of 3: 4.55 µs per loopa = np.array([False] * 100000 + [True])10000 loops, best of 3: 102 µs per loop10000 loops, best of 3: 115 µs per loop1000 loops, best of 3: 472 µs per loop10000 loops, best of 3: 108 µs per loop100000 loops, best of 3: 14 µs per loop100000 loops, best of 3: 4.45 µs per loop


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5664634.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存