获取 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 数组中的连续命中数及其第一个/最后一个索引的主要内容,如果未能解决你的问题,请参考以下文章

编写函数,返回在一个整数组中出现次数最多的数及其出现次数。

获取 3D numpy 数组中沿轴的连续非 nans 值总和的最大值

替换 2D numpy 数组中的连续重复项

Python数组及其基础操作Numpy ndarray

交错两个 numpy 索引数组,每个数组中的一项

将 pandas 中的单行输出到数组