Можно сделать выбор из ndarray, который представляет собой последовательность, не являющуюся кортежем, ndarray-объект целочисленного или логического типа данных или кортеж, в котором хотя бы один элемент является объектом последовательности. Расширенная индексация всегда возвращает копию данных. В отличие от этого, нарезка представляет только представление.
Существует два типа расширенной индексации — Integer и Boolean .
Целочисленная индексация
Этот механизм помогает в выборе любого произвольного элемента в массиве на основе его N-мерного индекса. Каждый целочисленный массив представляет количество индексов в этом измерении. Когда индекс состоит из столько целочисленных массивов, сколько размеров целевого ndarray, он становится простым.
В следующем примере выбран один элемент указанного столбца из каждой строки объекта ndarray. Следовательно, индекс строки содержит все номера строк, а индекс столбца указывает элемент, который должен быть выбран.
Пример 1
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
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
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 возвращаются в результате логического индексирования.
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 (не число) опускаются с помощью ~ (оператор дополнения).
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
В следующем примере показано, как отфильтровать не сложные элементы из массива.
import numpy as np a = np.array([1, 2+6j, 5, 3.5+5j]) print a[np.iscomplex(a)]
Здесь вывод выглядит следующим образом —