考虑一个条目,其中的条目仅由-1或1组成。如何获得包含1个且长度为t
的所有切片的范围(例如t=3
)
示例:
>>>a=np.array([-1,-1,1,1,1,1,1,-1,1,-1,-1,1,1,1,1], dtype=int)
>>> a
array([-1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, 1])
然后,t=3
的所需输出为[(2,7),(11,15)]
。
答案 0 :(得分:3)
# Append with `-1s` at either ends and get the differentiation
dfa = np.diff(np.hstack((-1,a,-1)))
# Get the positions of starts and stops of 1s in `a`
starts = np.where(dfa==2)[0]
stops = np.where(dfa==-2)[0]
# Get valid mask for pairs from starts and stops being of at least 3 in length
valid_mask = (stops - starts) >= 3
# Finally collect the valid pairs as the output
out = np.column_stack((starts,stops))[valid_mask].tolist()
答案 1 :(得分:0)
不熟悉numpy但是使用简单的功能会不会更好?
def slices(a, t):
start = None
i = 0 # index into array
slices = []
for val in a:
if a[i] == 1: # start of sequence
if start is None:
start = i
else: # -1 end of sequence
if start is not None:
if i - start >= t: # check sequence for minimum size
slices.append((start, i))
start = None
i += 1
# if sequence of 1's doesn't end with -1 within array
if start is not None:
if i - start >= t:
slices.append((start, i))
return slices