[英]From an array of indices how to create Python ranges?
使用 numpy 的where()
函數,我通過應用掩碼來獲取數組的索引。 例如,一個索引列表,其中 (1, 2, 3, 10, 11, 12, 13) where True
:
[1, 2, 3, 10, 11, 12, 13]
有沒有辦法在不同的范圍內轉換它(或直接從類似的函數中獲取它),例如:
[ range(1, 4), range(10, 14) ]
假設所有范圍僅包含單位差異,值得從搜索拆分位置的索引開始:
split_idx = np.flatnonzero(np.diff(ls, prepend = ls[0], append=ls[-1])!=1)
請注意,為了插入開始和結束索引,它略有改進。 可以像這樣完成進一步的工作:
bounding_points = np.transpose([split_idx[:-1], split_idx[1:]])
out = [range(ls[n], ls[m-1]+1) for n, m in bounding_points.tolist()]
示例運行:
>>> ls = [1, 2, 3, 10, 11, 12, 13, 16, 18, 19]
>>> split_idx
array([ 0, 3, 7, 8, 10], dtype=int32)
>>> bounding_points
array([[ 0, 3],
[ 3, 7],
[ 7, 8],
[ 8, 10]], dtype=int32)
>>> out
[range(1, 4), range(10, 14), range(16, 17), range(18, 20)]
閱讀我發給你的鏈接,我得到了這個答案:
from operator import itemgetter
from itertools import groupby
data = [1, 2, 3, 10, 11, 12, 13]
ranges = []
for key, group in groupby(enumerate(data), lambda x: x[0] - x[1]):
group = list(map(itemgetter(1), group))
if len(group) > 1:
ranges.append(range(group[0], group[-1]+1))
else:
ranges.append(group[0])
print(ranges)
輸出是
[range(1, 4), range(10, 14)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.