kenjutsu.format module

kenjutsu.format.index_to_slice(index)[source]

Convert an index to a slice.

Note

A single index behaves differently from a length 1 slice. When applying the former one reduces that dimension; whereas, applying the latter results in a singleton dimension being retained. Also if an index is out of bounds, one gets an IndexError. However, with an out of bounds length 1 slice, one simply doesn’t get the requested range.

Parameters:index (int) – an index to convert to a slice
Returns:a slice corresponding to the index
Return type:(slice)

Examples

>>> index_to_slice(1)
slice(1, 2, 1)
>>> index_to_slice(-1)
slice(-1, -2, -1)
kenjutsu.format.reformat_slice(a_slice, a_length=None)[source]

Takes a slice and reformats it to fill in as many undefined values as possible.

Parameters:
  • a_slice (slice) – a slice to reformat.
  • a_length (int) – a length to fill for stopping if not provided.
Returns:

a new slice with as many values filled in as

possible.

Return type:

(slice)

Examples

>>> reformat_slice(slice(2, -1, None))
slice(2, -1, 1)
>>> reformat_slice(slice(2, -1, None), 10)
slice(2, 9, 1)
kenjutsu.format.reformat_slices(slices, lengths=None)[source]

Takes a tuple of slices and reformats them to fill in as many undefined values as possible.

Parameters:
  • slices (tuple(slice)) – a tuple of slices to reformat.
  • lengths (tuple(int)) – a tuple of lengths to fill.
Returns:

a tuple of slices with all default

values filled if possible.

Return type:

(slice)

Examples

>>> reformat_slices(
...     (
...         slice(None),
...         slice(3, None),
...         slice(None, 5),
...         slice(None, None, 2)
...     ),
...     (10, 13, 15, 20)
... )
(slice(0, 10, 1), slice(3, 13, 1), slice(0, 5, 1), slice(0, 20, 2))
kenjutsu.format.split_indices(slices)[source]

Splits slices with multiple indices into multiple splices.

Support of slices with a sequence of indices is varied. Some libraries like NumPy support them without issues. Other libraries like h5py support them as long as they are in sequential order. In still other libraries support is non-existent. However, in all those cases normally a single index is permissible. This converts slices with multiple indices into a list of slices with a single index each. While this still leaves it up to the user to iterate over these and combine the results in some sensible way, it is better than just getting a failure and should extend well to a variety of cases.

Parameters:slices (tuple(slice)) – a tuple of slices to split
Returns:a list of a tuple of slices
Return type:(list(tuple(slice)))

Examples

>>> split_indices(
...     (
...         3,
...         Ellipsis,
...         [0, 1, 2],
...         slice(2, 5),
...         slice(4, 6, 2)
...     )
... )  
[(3, Ellipsis, slice(0, 1, 1), slice(2, 5, 1), slice(4, 6, 2)),
 (3, Ellipsis, slice(1, 2, 1), slice(2, 5, 1), slice(4, 6, 2)),
 (3, Ellipsis, slice(2, 3, 1), slice(2, 5, 1), slice(4, 6, 2))]