Отрицательная индексация массива 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,

Другие вопросы по тегам