gpt4 book ai didi

python - Pandas :计算第一个连续的真值

转载 作者:太空狗 更新时间:2023-10-29 18:17:08 25 4
gpt4 key购买 nike

我正在尝试实现一个函数来识别 Pandas Series 中的 first consecutive 出现,它已经被我想要的条件掩盖了:(例如)

[真,真,真,假,真,假,真,真,真,真]

我希望上面的输入给出 3 的结果,即从系列开头开始连续出现 3 次 True

我知道一个大的 for 循环就可以完成这项工作,但是是否有任何矢量化/以 Pandas 为中心的方法来绕过它?

非常感谢。

最佳答案

问题:

找到第一个连续的 True
考虑 a

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

答案 1
numpy:在 a 的否定上使用 np.logical_and.accumulate 并取其否定来制作消除第一个系列的掩码False 如果它们应该存在。然后在末尾附加一个 False 以确保我们有一个非 True 分钟。最后,使用 np.argmin 定位第一个最小值。如果它找到一个位置 3,那将在它之前指示 3 True 值。

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

3

答案 2
numba.njit

我想使用 numba 这样我就可以循环并确保在我们想要/需要时短路。这是阵列中肯定要尽早回答的问题。不需要无缘无故地评估整个阵列的事物。

from numba import njit

@njit
def 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 c

first_true(a)

3

答案 3
numpy 更智能地使用 argminargmax。我用 False 包围 a 然后使用 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

这些答案有多快?
See @Divakar's Answer for source code of other functions being timed

%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 loop
100000 loops, best of 3: 8.32 µs per loop
10000 loops, best of 3: 27.4 µs per loop
100000 loops, best of 3: 5.48 µs per loop
100000 loops, best of 3: 5.38 µs per loop
1000000 loops, best of 3: 1.35 µs per loop

a = np.array([False] * 100000 + [True] * 10000)
10000 loops, best of 3: 112 µs per loop
10000 loops, best of 3: 127 µs per loop
1000 loops, best of 3: 513 µs per loop
10000 loops, best of 3: 110 µs per loop
100000 loops, best of 3: 13.9 µs per loop
100000 loops, best of 3: 4.55 µs per loop

a = np.array([False] * 100000 + [True])
10000 loops, best of 3: 102 µs per loop
10000 loops, best of 3: 115 µs per loop
1000 loops, best of 3: 472 µs per loop
10000 loops, best of 3: 108 µs per loop
100000 loops, best of 3: 14 µs per loop
100000 loops, best of 3: 4.45 µs per loop

关于python - Pandas :计算第一个连续的真值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44611125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com