获取 NumPy 数组中的连续命中数及其第一个/最后一个索引
Posted
技术标签:
【中文标题】获取 NumPy 数组中的连续命中数及其第一个/最后一个索引【英文标题】:Get # of contiguous hits and their first/last index in a NumPy array 【发布时间】:2017-08-17 05:46:01 【问题描述】:这是一个 itertools 解决方案,它返回每个连续块的长度列表。这里一个连续的块是一连串的 1,中间没有中断。有没有办法让 itertools 返回与每个块关联的索引?
import itertools
import numpy as np
stack = np.zeros((10,10))
stack[0] = 1
stack[5,:5] = 1
contiguous_hits = [ (sum( 1 for _ in group )) for row in stack for key, group in itertools.groupby(row) if key ]
非常感谢!
【问题讨论】:
为什么是sum( 1 for _ in group ))
?为什么不只是sum(group)
?
我认为最初我使用的是 True/False 值而不是整数
好的。所以你只计算连续的吗?
是的,这是正确的.. 我应该更清楚
连续是什么意思? [1, 1, 1, 0, 1, 1]
的答案是什么?
【参考方案1】:
这是一种矢量化方法 -
def start_stop_per_row(stack):
z = np.zeros((stack.shape[0],1),dtype=stack.dtype)
z_ext = np.column_stack((z,stack,z))
mask = z_ext[:,1:] != z_ext[:,:-1]
idx = np.argwhere(mask)
return pd.DataFrame('row':idx[::2,0],'start':idx[::2,1],'stop':idx[1::2,1]-1)
示例运行 -
In [108]: stack
Out[108]:
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 0, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0]])
In [109]: start_stop_per_row(stack)
Out[109]:
row start stop
0 0 0 9
1 2 1 4
2 2 7 9
3 5 0 4
【讨论】:
以上是关于获取 NumPy 数组中的连续命中数及其第一个/最后一个索引的主要内容,如果未能解决你的问题,请参考以下文章