Отрицательная индексация массива Python - PullRequest
0 голосов
/ 07 января 2019

Я немного запутался по поводу индексации 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 ]

0 голосов
/ 07 января 2019

Если вы запросите срез 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.

0 голосов
/ 07 января 2019

У вас есть это заявление:

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]

Если мы начнем и остановим на одном и том же индексе, то мы ни к чему не приведем, и в результате будет возвращена пустая структура данных (массив / список / кортеж и т. Д.).

...