3 回答

TA贡献1982条经验 获得超2个赞
尽管不是numpy原始itertools函数,但函数通常非常快,因此请尝试一下(当然,还要测量包括该函数在内的各种解决方案的时间):
def runs_of_ones(bits):
for bit, group in itertools.groupby(bits):
if bit: yield sum(group)
如果确实需要列表中的值,那么当然可以使用list(runs_of_ones(bits));但也许列表理解仍然会稍微快一些:
def runs_of_ones_list(bits):
return [sum(g) for b, g in itertools.groupby(bits) if b]
转向“ numpy-native”的可能性,那么:
def runs_of_ones_array(bits):
# make sure all runs of ones are well-bounded
bounded = numpy.hstack(([0], bits, [0]))
# get 1 at run starts and -1 at run ends
difs = numpy.diff(bounded)
run_starts, = numpy.where(difs > 0)
run_ends, = numpy.where(difs < 0)
return run_ends - run_starts
再说一遍:请确保在为您量身定制的示例中相互比较基准解决方案!
添加回答
举报