簡體   English   中英

從索引數組如何創建 Python 范圍?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM