numpy.s_
numpy.s_ = <numpy.lib.index_tricks.IndexExpression object>
Объект s_ создает объект среза.
Данный объект абсолютно эквивалентен index_exp
с одним лишь отличием - для одного выражения он возвращает сам объект среза, в то время, как index_exp
упаковывает его в кортеж.
Примеры
Иногда возникает необходимость конструировать индексы для массивов в одном месте программы, а использовать в другом. Или генерировать сразу некоторое множество индексов. В таких случаях как раз и удобно использовать конструктор индексов.
Начнем с простого:
>>> 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]])