# Get start, stop index pairs for islands/seq. of 1s
idx_pairs = np.where(np.diff(np.hstack(([False],a1==1,[False]))))[0].reshape(-1,2)
# Get the island lengths, whose argmax would give us the ID of longest island.
# Start index of that island would be the desired output
start_longest_seq = idx_pairs[np.diff(idx_pairs,axis=1).argmax(),0]
样品运行-
In [89]: a1 # Input array
Out[89]: array([0, 0, 1, 1, 1, 1, 0, 0, 1, 1])
In [90]: idx_pairs # Start, stop+1 index pairs
Out[90]:
array([[ 2, 6],
[ 8, 10]])
In [91]: np.diff(idx_pairs,axis=1) # Island lengths
Out[91]:
array([[4],
[2]])
In [92]: np.diff(idx_pairs,axis=1).argmax() # Longest island ID
Out[92]: 0
In [93]: idx_pairs[np.diff(idx_pairs,axis=1).argmax(),0] # Longest island start
Out[93]: 2
from itertools import groupby
L = [0,0,1,1,1,1,0,0,1,1]
print max(((lambda y: (y[0][0], len(y)))(list(g)) for k, g in groupby(enumerate(L), lambda x: x[1]) if k), key=lambda z: z[1])[0]
# Using your list and the answer from the post you referred
from itertools import groupby
L = [0,0,1,1,1,1,0,0,1,1]
m = max(sum(1 for i in g) for k, g in groupby(L))
# Here is the for loop
for i, s in enumerate(L):
if len(L) - i + 2 < len(L) - m:
break
if s == 1 and 0 not in L[i:i+m]:
print i
break
8条答案
按热度按时间643ylb081#
受
this solution
的启发,这里有一个矢量化的方法来解决这个问题-样品运行-
zvms9eto2#
使用
groupby()
的更紧凑的单行程序。对原始数据使用enumerate()
以保持分析管道中的起始位置,最终以元组[(2,4),(8,2)]列表结束,每个元组包含非零游程的起始位置和长度:lambda: x
是groupby()
的关键函数,因为我们枚举了Llambda: y
会封装我们需要的结果,因为我们只能评估g
一次,而不会储存lambda: z
是max()
拉出长度的关键函数按预期打印“2”。
u5i3ibmn3#
这似乎是可行的,使用
itertools
中的groupby
,只遍历列表一次:doinxwow4#
你可以使用for循环,检查下面的几项(长度为
m
,其中m
是最大长度)是否与最大长度相同:这将给予:
2g32fytz5#
另一种在单个循环中执行的方法,但不需要求助于
itertool
的groupby
。这也可以使用
reduce
以一行程序的方式完成:在Python 3中,你不能在
lambda
参数定义中解包元组,所以最好先用def
定义函数:在这三种情况中的任何一种情况下,
max_start
都会给出您的答案(即2
)。nzrxty8p6#
使用
more_itertools
(第三方库):给定
代码
另请参阅
more_itertools.locate
文件字串,以取得这些工具如何运作的详细信息。0ve6wy6x7#
对于另一个只使用Numpy的解决方案,我认为这应该在所有情况下都有效。不过,投票最多的解决方案可能更快。
mwyxok5s8#
我已经在
haggis.npy_util.mask2runs
中实现了一个numpy数组的run搜索函数,可以像这样使用它: