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
再說一遍:請確保在為您量身定制的示例中相互比較基準解決方案!
添加回答
舉報