gpt4 book ai didi

python - 将 numpy 掩码有效地扩展到每个错误值的右侧 n 个单元格

转载 作者:太空狗 更新时间:2023-10-29 20:34:43 28 4
gpt4 key购买 nike

假设我有一个长度为 30 的数组,其中有 4 个错误值。我想为那些坏值创建一个掩码,但由于我将使用滚动窗口函数,我还希望在每个坏值之后有固定数量的后续索引被标记为坏。在下面,n = 3:

enter image description here

我想尽可能高效地执行此操作,因为此例程将在包含数十亿个数据点的大型数据系列上运行多次。因此,我需要尽可能接近 numpy 向量化解决方案,因为我想避免 python 循环。

为了避免重新输入,这里是数组:

import numpy as np
a = np.array([4, 0, 8, 5, 10, 9, np.nan, 1, 4, 9, 9, np.nan, np.nan, 9,\
9, 8, 0, 3, 7, 9, 2, 6, 7, 2, 9, 4, 1, 1, np.nan, 10])

最佳答案

又一个答案!
它只是采用您已经拥有的掩码并将逻辑或应用于自身的移位版本。很好地矢量化并且非常快! :D

def repeat_or(a, n=4):
m = np.isnan(a)
k = m.copy()

# lenM and lenK say for each mask how many
# subsequent Trues there are at least
lenM, lenK = 1, 1

# we run until a combination of both masks will give us n or more
# subsequent Trues
while lenM+lenK < n:
# append what we have in k to the end of what we have in m
m[lenM:] |= k[:-lenM]

# swap so that m is again the small one
m, k = k, m

# update the lengths
lenM, lenK = lenK, lenM+lenK

# see how much m has to be shifted in order to append the missing Trues
k[n-lenM:] |= m[:-n+lenM]

return k

不幸的是,我无法让 m[i:] |= m[:-i] 运行……修改和使用掩码修改自身可能不是一个好主意。它确实适用于 m[:-i] |= m[i:],但是这是错误的方向。
无论如何,我们现在有类似斐波那契的增长,而不是二次增长,这仍然比线性增长要好。
(我从没想过我会写一个与斐波那契数列真正相关的算法,而不是一些奇怪的数学问题。)

在“真实”条件下使用大小为 1e6 和 1e5 的 NAN 数组进行测试:

In [5]: a = np.random.random(size=1e6)

In [6]: a[np.random.choice(np.arange(len(a), dtype=int), 1e5, replace=False)] = np.nan

In [7]: %timeit reduceat(a)
10 loops, best of 3: 65.2 ms per loop

In [8]: %timeit index_expansion(a)
100 loops, best of 3: 12 ms per loop

In [9]: %timeit cumsum_trick(a)
10 loops, best of 3: 17 ms per loop

In [10]: %timeit repeat_or(a)
1000 loops, best of 3: 1.9 ms per loop

In [11]: %timeit agml_indexing(a)
100 loops, best of 3: 6.91 ms per loop

我会将进一步的基准留给 Thomas。

关于python - 将 numpy 掩码有效地扩展到每个错误值的右侧 n 个单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32706135/

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