Вы можете использовать понимание списка с enumerate
и zip
:
res = [a[idx, start: end] for idx, (start, end) in enumerate(zip(start_idx, end_idx))]
# [array([2, 3]), array([7, 8])]
Это похоже на решение @ Bazingaa, но итерирует по start_idx
/ end_idx
напрямую, а не по позиционной индексации списка.
Повышение производительности незначительно и может проявиться только для больших массивов. Тем не менее, вы можете счесть перечисляющую логику более читабельной.
n = 100000
a = np.array([[1,2,3,4], [5,6,7,8]]*n)
start_idx = [1,2] * n
end_idx = [3,4] * n
def indexing(a, start_idx, end_idx):
return [a[i, start_idx[i]:end_idx[i]] for i in range(len(start_idx))]
def enumerating(a, start_idx, end_idx):
return [a[idx, start: end] for idx, (start, end) in enumerate(zip(start_idx, end_idx))]
%timeit indexing(a, start_idx, end_idx) # 140 ms
%timeit enumerating(a, start_idx, end_idx) # 124 ms