3 回答

TA貢獻(xiàn)1982條經(jīng)驗 獲得超2個贊
盡管不是numpy原始itertools函數(shù),但函數(shù)通常非??欤虼苏垏L試一下(當(dāng)然,還要測量包括該函數(shù)在內(nèi)的各種解決方案的時間):
def runs_of_ones(bits):
for bit, group in itertools.groupby(bits):
if bit: yield sum(group)
如果確實需要列表中的值,那么當(dāng)然可以使用list(runs_of_ones(bits));但也許列表理解仍然會稍微快一些:
def runs_of_ones_list(bits):
return [sum(g) for b, g in itertools.groupby(bits) if b]
轉(zhuǎn)向“ 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
再說一遍:請確保在為您量身定制的示例中相互比較基準(zhǔn)解決方案!
添加回答
舉報