numpy.s_

numpy.s_ = <numpy.lib.index_tricks.IndexExpression object>

Объект s_ создает объект среза.

Данный объект абсолютно эквивалентен index_exp с одним лишь отличием - для одного выражения он возвращает сам объект среза, в то время, как index_exp упаковывает его в кортеж.

Смотрите так же:
index_exp, r_, c_


Примеры

Иногда возникает необходимость конструировать индексы для массивов в одном месте программы, а использовать в другом. Или генерировать сразу некоторое множество индексов. В таких случаях как раз и удобно использовать конструктор индексов.

Начнем с простого:

>>> import numpy as np
>>> 
>>> np.s_[3:7]    #  возвращает объект среза
slice(3, 7, None)
>>> 
>>> a = np.arange(11)
>>> a
array([ 0,  1,  2, ...,  8,  9, 10])
>>> 
>>> a[np.s_[3:7]]    #  который может быть использован для индексирования
array([3, 4, 5, 6])

Можем указать шаг среза:

>>> slice = np.s_[1:10:2]
>>> 
>>> a[slice]
array([1, 3, 5, 7, 9])

Некоторые параметры среза, могут быть вычислены на основе параметров самого массива:

>>> slice_1 = np.s_[0 : a.size : a.size % 3]
>>> slice_1
slice(0, 11, 2)
>>> 
>>> a[slice_1]
array([ 0,  2,  4,  6,  8, 10])

Данный объект поддерживает абсолютно любую индексацию NumPy. Давайте создадим двумерный массив и рассмотрим несколько примеров:

>>> a = np.arange(36).reshape(6, 6)
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])

Давайте попробуем вытащить из каждой нечетной строки 1-й, 4-й и 5-й элементы:

>>> slice = np.s_[np.s_[0:6:2], [1, 4, 5]]
>>> slice
(slice(0, 6, 2), [1, 4, 5])
>>> 
>>> a[slice]
array([[ 1,  4,  5],
       [13, 16, 17],
       [25, 28, 29]])
>>> 
>>> 
>>> #  Давайте проверим:
... a[0::2, [1, 4, 5]]
array([[ 1,  4,  5],
       [13, 16, 17],
       [25, 28, 29]])

>>> c = np.array([True, True, False, False, True, True])
>>> slice = np.s_[c, np.s_[::2]]
>>> slice
(array([True,  True, False, False,  True,  True]), slice(None, None, 2))
>>> 
>>> a[slice]
array([[ 0,  2,  4],
       [ 6,  8, 10],
       [24, 26, 28],
       [30, 32, 34]])

Если передать объекту передать несколько индексных выражений, то будет возвращен кортеж:

>>> np.s_[::2, 1:10:2]
(slice(None, None, 2), slice(1, 10, 2))

Элементы такого кортежа так же можно использовать для индексирования:

>>> slice = np.s_[::2, [1, 4]]
>>> slice
(slice(None, None, 2), [1, 4])
>>> 
>>> a[slice[0]]
array([[ 0,  1,  2,  3,  4,  5],
       [12, 13, 14, 15, 16, 17],
       [24, 25, 26, 27, 28, 29]])
>>> 
>>> a[slice[1]]
array([[ 6,  7,  8,  9, 10, 11],
       [24, 25, 26, 27, 28, 29]])