在另一个数组中创建“条纹”的开始和结束索引的2 numpy数组。

时间:2018-07-10 07:03:54

标签: python numpy

假设我有一个数字myArray = ([1, 1, 0, 2, 0, 1, 1, 1, 1, 0, 0 ,1, 2, 1, 1, 1])的一维numpy数组。

我想创建一个2D numpy数组,该数组描述连续1的任何“条纹”(长于2)的第一个(列1)和最后一个(列2)索引。 因此,对于上面的示例,二维数组应如下所示:

indicesArray = ([5, 8], [13, 15])

因为在第5、6、7、8和13、14、15位至少有3个连续的。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

方法1

这是一种受this post启发的方法-

def start_stop(a, trigger_val, len_thresh=2):
    # "Enclose" mask with sentients to catch shifts later on
    mask = np.r_[False,np.equal(a, trigger_val),False]

    # Get the shifting indices
    idx = np.flatnonzero(mask[1:] != mask[:-1])

    # Get lengths
    lens = idx[1::2] - idx[::2]

    return idx.reshape(-1,2)[lens>len_thresh]-[0,1]

样品运行-

In [47]: myArray
Out[47]: array([1, 1, 0, 2, 0, 1, 1, 1, 1, 0, 0, 1, 2, 1, 1, 1])

In [48]: start_stop(myArray, trigger_val=1, len_thresh=2)
Out[48]: 
array([[ 5,  8],
       [13, 15]])

方法2

另一个与binary_erosion-

from scipy.ndimage.morphology import binary_erosion

mask = binary_erosion(myArray==1,structure=np.ones((3)))
idx = np.flatnonzero(mask[1:] != mask[:-1])
out = idx.reshape(-1,2)+[0,1]