假设我有一个数字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个连续的。
任何帮助将不胜感激。
答案 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]