Как определить индекс на основе последовательности с начальными и конечными значениями - PullRequest
0 голосов
/ 18 января 2020

У меня есть набор индексов, который определяет начало:

Int64Index([0, 3, 5, 6, 7, 8, 10, 15, 20, 22], dtype='int64')

и конец:

Int64Index([2, 5, 7, 8, 9, 10, 12, 17, 22, 24], dtype='int64')

диапазонов, которые следует использовать в качестве желаемого индекса. Другими словами, я хотел бы получить индекс, который будет включать все целые числа от 0 до 2 (включительно), затем от 3 до 5 (включительно), ..., от 10 до 12 (включительно), от 15 до 17 (включительно) и тд. Полученный индекс будет:

Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, **15**, 16, 17, **20**, 21, 22, 23, 24], dtype='int64')

(обратите внимание на разрыв перед 15 и 20). Таким образом, пары последующих значений будут определять диапазоны, а затем эти диапазоны будут объединены.

Как я могу получить это?

Моя попытка:

np.unique(np.concatenate([np.arange(start, end + 1) for start, end in zip(indices_starts, indices_ends)]))

Но кажется, что должно быть более простое и потенциально более быстрое решение.

Ответы [ 2 ]

2 голосов
/ 19 января 2020
start = [0, 3, 5, 6, 7, 8, 10, 15, 20, 22]
end   = [2, 5, 7, 8, 9, 10, 12, 17, 22, 24]

# Create an empty list for your indexes
new_idx = []

# Add the new indexes
for s, e in zip(start, end):
    new_idx.extend(list(range(s,e+1)))

# Drop duplicated values
list(set(new_idx))

Надеюсь, это поможет!

0 голосов
/ 19 января 2020

Ваш список результатов индекса не точен в соответствии с вашим описанием. При условии, что диапазоны индексов являются ИНКЛЮЗИВНЫМИ, результирующий список индексов будет:

starts  = [0, 3, 5, 6, 7, 8, 10, 15, 20, 22]
ends    = [2, 5, 7, 8, 9, 10, 12, 17, 22, 24]
indexes = []
for i in range(len(starts)):
    indexes.extend(list(range(starts[i], ends[i] + 1)))
print(indexes)
# [0, 1, 2, 3, 4, 5, 5, 6, 7, 6, 7, 8, 7, 8, ... 20, 21, 22, 22, 23, 24]

При условии, что диапазоны индексов будут ИСКЛЮЧИТЕЛЬНО:

...
for i in range(len(starts)):
    indexes.extend(list(range(starts[i], ends[i])))
print(indexes)
# [0, 1, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 11, 15, 16, 20, 21, 22, 23]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...