Я думаю, что вы переполняете вещи, особенно при обработке fslice
. Анкет Если вы просто сделали:
def fancy_subarray(farray, fdim, fslice):
fdim += farray.ndim if fdim < 0 else 0
index = ((slice(None),) * fdim + (fslice,) +
(slice(None),) * (farray.ndim - fdim - 1))
return farray[index]
Тогда вы не только делаете свой код более компактным, но и та же функция может принимать отдельные индексы, ломтики или даже списки индексов:
>>> fancy_subarray(a, 1, 2)
array([[10, 11, 12, 13, 14],
[30, 31, 32, 33, 34],
[50, 51, 52, 53, 54]])
>>> fancy_subarray(a, 1, slice(2,3))
array([[[10, 11, 12, 13, 14]],
[[30, 31, 32, 33, 34]],
[[50, 51, 52, 53, 54]]])
>>> fancy_subarray(a, 1, [2, 3])
array([[[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[30, 31, 32, 33, 34],
[35, 36, 37, 38, 39]],
[[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]]])