Отрицательная индексация массива Python
Я немного запутался по поводу индексации numpy. Предположим следующий пример:
>>> import numpy as np
>>> x = np.arange(10)
>>> x.shape = (2,5)
>>> x
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> x[0:-1]
array([[0, 1, 2, 3, 4]])
>>> x[1:-1]
array([], shape=(0, 5), dtype=int64)
>>> x[1:]
array([[5, 6, 7, 8, 9]])
Что меня смущает, я могу получить первую строку в виде 2D-массива, используя x[0:-1]
, Но что -1
на самом деле значит с точки зрения показателей? Я бы подумал, что зовет x[1:-1]
затем дал бы мне вторую строку, но вместо этого, если возвращает мне пустой массив, и чтобы получить то, что я хочу, мне нужно использовать x[1:]?
Я немного смущен. Спасибо за помощь
2 ответа
У вас есть это заявление:
In [31]: x[0:-1]
Этот способ индексации означает, что "начинайте с 1-го ряда и продолжайте до последнего ряда (исключая)". Вот почему мы получаем первый ряд в результате.
Out[31]: array([[0, 1, 2, 3, 4]])
Но когда вы делаете:
In [31]: x[1:-1]
Out[31]: array([], shape=(0, 5), dtype=int64)
Он просит NumPy "начать со второго ряда и не включать последний ряд". Поскольку здесь вторая строка также является последней строкой, она исключается, и в результате мы получаем пустой массив.
Дополнительная информация: нет ничего конкретного в использовании отрицательной индексации, такой как -1
Вот. Например, следующие способы индексации также будут возвращать пустые массивы.
# asking to "start at first row and end at first row"
In [42]: x[0:0]
Out[42]: array([], shape=(0, 5), dtype=int64)
# asking to "start at second row and end at second row"
In [43]: x[1:1]
Out[43]: array([], shape=(0, 5), dtype=int64)
Когда дело доходит до индексации в Python/NumPy, она всегда "включена слева и справа эксклюзивно".
Вот что-то в простом Python (т.е. индексирование list
)
In [52]: lst = [1, 2]
In [53]: lst[1:-1]
Out[53]: [] # an empty list
Пожалуйста, обратите внимание на структуру индексации, которая: [start:stop:step]
Если мы начнем и остановимся на одном и том же индексе, то мы ничего не получим, и в результате будет возвращена пустая структура данных (массив / список / кортеж и т. Д.).
Если вы запрашиваете ломтик x[a:b]
, вы получите раздел, охватывающий от a
до но не включая b
, Так что, если вы нарежете x[1:-1]
результирующий массив не будет включать -1
, который случается так же, как 1
в (2,5)
массив. Другой пример:
>>> import numpy as np
>>> x = np.arange(15)
>>> x.shape = (3,5)
>>> x
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> x[0:-1]
array([[0, 1, 2, 3, 4]])
>>> x[1:-1]
array([[5, 6, 7, 8, 9]])
Последняя операция над ломтиками x
из ряда 1
до (не включая) последний ряд, который является просто строкой 1
,