查找第一个连续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
,以确保我们没有
Truemin。最后,使用
np.argmin查找第一个最小值。如果找到一个position
3,它将
3
True在其之前指示值。
np.argmin(np.append(a[~np.logical_and.accumulate(~a)], False))3
答案2numba.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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)