NumPy - индексирование и нарезка

Доступ к содержимому объекта ndarray и его изменение можно получить путем индексации или нарезки, как и для встроенных объектов контейнера Python.

Как упоминалось ранее, элементы в объекте ndarray следует за индексом, начинающимся с нуля. Доступны три типа методов индексации -field access, basic slicing и advanced indexing.

Базовая нарезка - это расширение базовой концепции Python о нарезке на n измерений. Объект фрагмента Python создается путем предоставленияstart, stop, и step параметры к встроенному sliceфункция. Этот объект среза передается в массив для извлечения части массива.

Пример 1

import numpy as np 
a = np.arange(10) 
s = slice(2,7,2) 
print a[s]

Его вывод выглядит следующим образом -

[2  4  6]

В приведенном выше примере ndarray объект подготовлен arange()функция. Затем объект среза определяется со значениями start, stop и step 2, 7 и 2 соответственно. Когда этот объект среза передается в ndarray, его часть, начиная с индекса 2 и заканчивая 7 с шагом 2, нарезается.

Тот же результат можно получить, задав параметры нарезки, разделенные двоеточием: (start: stop: step), непосредственно в ndarray объект.

Пример 2

import numpy as np 
a = np.arange(10) 
b = a[2:7:2] 
print b

Здесь мы получим тот же результат -

[2  4  6]

Если указан только один параметр, будет возвращен единственный элемент, соответствующий индексу. Если перед ним вставлен:, будут извлечены все элементы, начиная с этого индекса. Если используются два параметра (с: между ними), элементы между двумя индексами (не включая индекс остановки) с шагом по умолчанию один разделяются.

Пример 3

# slice single item 
import numpy as np 

a = np.arange(10) 
b = a[5] 
print b

Его вывод выглядит следующим образом -

5

Пример 4

# slice items starting from index 
import numpy as np 
a = np.arange(10) 
print a[2:]

Теперь вывод будет -

[2  3  4  5  6  7  8  9]

Пример 5

# slice items between indexes 
import numpy as np 
a = np.arange(10) 
print a[2:5]

Здесь вывод будет -

[2  3  4]

Приведенное выше описание относится к многомерным ndarray тоже.

Пример 6

import numpy as np 
a = np.array([[1,2,3],[3,4,5],[4,5,6]]) 
print a  

# slice items starting from index
print 'Now we will slice the array from the index a[1:]' 
print a[1:]

Результат выглядит следующим образом -

[[1 2 3]
 [3 4 5]
 [4 5 6]]

Now we will slice the array from the index a[1:]
[[3 4 5]
 [4 5 6]]

Нарезка также может включать многоточие (…) для создания кортежа выбора той же длины, что и размер массива. Если в позиции строки используется многоточие, он вернет ndarray, состоящий из элементов в строках.

Пример 7

# array to begin with 
import numpy as np 
a = np.array([[1,2,3],[3,4,5],[4,5,6]]) 

print 'Our array is:' 
print a 
print '\n'  

# this returns array of items in the second column 
print 'The items in the second column are:'  
print a[...,1] 
print '\n'  

# Now we will slice all items from the second row 
print 'The items in the second row are:' 
print a[1,...] 
print '\n'  

# Now we will slice all items from column 1 onwards 
print 'The items column 1 onwards are:' 
print a[...,1:]

Результат этой программы следующий -

Our array is:
[[1 2 3]
 [3 4 5]
 [4 5 6]] 
 
The items in the second column are: 
[2 4 5] 

The items in the second row are:
[3 4 5]

The items column 1 onwards are:
[[2 3]
 [4 5]
 [5 6]]