Penso che tu stia complicando eccessivamente le cose, specialmente durante la gestione fslice
. Se hai semplicemente fatto:
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]
Quindi non solo rendi il tuo codice più compatto, ma la stessa funzione può assumere singoli indici, fette o persino elenchi di indici:
>>> 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]]])