【问题标题】:Get # of contiguous hits and their first/last index in a NumPy array获取 NumPy 数组中的连续命中数及其第一个/最后一个索引
【发布时间】: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] 的答案是什么?

标签: python numpy itertools


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2013-09-14
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多