例如:
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信息。
答案 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()
确保这将导致正确的重复。