Учебники

NumPy — расширенное индексирование

Можно сделать выбор из ndarray, который представляет собой последовательность, не являющуюся кортежем, ndarray-объект целочисленного или логического типа данных или кортеж, в котором хотя бы один элемент является объектом последовательности. Расширенная индексация всегда возвращает копию данных. В отличие от этого, нарезка представляет только представление.

Существует два типа расширенной индексации — Integer и Boolean .

Целочисленная индексация

Этот механизм помогает в выборе любого произвольного элемента в массиве на основе его N-мерного индекса. Каждый целочисленный массив представляет количество индексов в этом измерении. Когда индекс состоит из столько целочисленных массивов, сколько размеров целевого ndarray, он становится простым.

В следующем примере выбран один элемент указанного столбца из каждой строки объекта ndarray. Следовательно, индекс строки содержит все номера строк, а индекс столбца указывает элемент, который должен быть выбран.

Пример 1

Live Demo

import numpy as np 

x = np.array([[1, 2], [3, 4], [5, 6]]) 
y = x[[0,1,2], [0,1,0]] 
print y

Его вывод будет следующим:

[1  4  5]

Выбор включает в себя элементы в (0,0), (1,1) и (2,0) из первого массива.

В следующем примере выбираются элементы, расположенные по углам массива 4X3. Индексами выбора строк являются [0, 0] и [3,3], тогда как индексами столбцов являются [0,2] и [0,2].

Пример 2

Live Demo

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 
   
print 'Our array is:' 
print x 
print '\n' 

rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols] 
   
print 'The corner elements of this array are:' 
print y

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

Our array is:                                                                 
[[ 0  1  2]                                                                   
 [ 3  4  5]                                                                   
 [ 6  7  8]                                                                   
 [ 9 10 11]]
 
The corner elements of this array are:                                        
[[ 0  2]                                                                      
 [ 9 11]] 

Результирующий выбор представляет собой объект ndarray, содержащий угловые элементы.

Расширенное и базовое индексирование можно объединить с помощью одного фрагмента (:) или многоточия (…) с индексным массивом. В следующем примере используется слайс для строки и расширенный индекс для столбца. Результат одинаков, когда срез используется для обоих. Но расширенный индекс приводит к копированию и может иметь разную структуру памяти.

Пример 3

Live Demo

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

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

# slicing 
z = x[1:4,1:3] 

print 'After slicing, our array becomes:' 
print z 
print '\n'  

# using advanced index for column 
y = x[1:4,[1,2]] 

print 'Slicing using advanced index for column:' 
print y

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

Our array is:
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8]
 [ 9 10 11]]
 
After slicing, our array becomes:
[[ 4  5]
 [ 7  8]
 [10 11]]

Slicing using advanced index for column:
[[ 4  5]
 [ 7  8]
 [10 11]] 

Индексирование логических массивов

Этот тип расширенного индексирования используется, когда результирующий объект должен быть результатом булевых операций, таких как операторы сравнения.

Пример 1

В этом примере элементы больше 5 возвращаются в результате логического индексирования.

Live Demo

import numpy as np 
x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 

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

# Now we will print the items greater than 5 
print 'The items greater than 5 are:' 
print x[x > 5]

Результатом этой программы будет —

Our array is: 
[[ 0  1  2] 
 [ 3  4  5] 
 [ 6  7  8] 
 [ 9 10 11]] 
 
The items greater than 5 are:
[ 6  7  8  9 10 11] 

Пример 2

В этом примере элементы NaN (не число) опускаются с помощью ~ (оператор дополнения).

Live Demo

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

Его вывод будет —

[ 1.   2.   3.   4.   5.] 

Пример 3

В следующем примере показано, как отфильтровать не сложные элементы из массива.

Live Demo

import numpy as np 
a = np.array([1, 2+6j, 5, 3.5+5j]) 
print a[np.iscomplex(a)]

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