我认为您过于复杂的事情,尤其是在处理时 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]]])