在numpy中的条件函数之前是否存在保持值?

时间:2019-07-04 21:13:06

标签: algorithm numpy

例如:

pre_hold_list = [-2,0,0,-1,0,0,0,3,0,0]
hold_condition = lambda x:x != 0
output = np.hold(pre_hold_list, hold_condition)
[-2,-2,-2,-1,-1,-1,-1,3,3,3] #result of output

这里的条件是当前值不为零,该函数将保持满足该条件的值,直到下一个满足该条件的值为止(即,将保持-2,然后是-1,然后是3)。

搜索np.hold()或np.step()不会给我任何Google信息。

2 个答案:

答案 0 :(得分:2)

没关系,我编写了一个函数,该函数使用cumsum和diff的累加性质进行此操作。如果有改善的方法,请告诉我。

git rebase

编辑: 我在解决方案和@Willem Van Onsem之间进行了性能检查,而我的时间非常短。

--amend

答案 1 :(得分:1)

您可以在此处使用cumsum(..) [numpy-doc]diff() [numpy-doc]来技巧:

import numpy as np

def hold(iterable, condition):
    cond = np.array(condition)
    vals = np.array(iterable)
    a = vals * cond
    a[cond] = np.diff(np.hstack(((0,), a[cond])))
    return a.cumsum()

第一个参数是包含元素的iterable,第二个参数condition是与布尔值相同长度的可迭代对象。

例如:

>>> a
array([-2,  0,  0, -1,  0,  0,  0,  3,  0,  0])
>>> hold(a, a != 0)
array([-2, -2, -2, -1, -1, -1, -1,  3,  3,  3])
>>> hold(a, a != 0)
array([-2, -2, -2, -1, -1, -1, -1,  3,  3,  3])

该功能的工作原理如下。此外,我们还制作了两个可迭代对象的副本(如果尚不可行,请将其转换为numpy数组)。如果这些是numpy数组,则可以忽略。

接下来,我们执行元素乘法,以使条件不为零的值保持不变。

接下来,我们计算条件成立的每个项目与下一个项目之间的差异,并将其设置为a。最后,我们可以使用a的累积总和,因为.diff()确保这将导致正确的重复。