English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Срезы массивов NumPy

Срез массива

В Python срез означает выбор элементов из массива от одного заданного индекса до другого.
Мы передаем срезы вместо индексов, как это:[start:end].
Мы также можем определить шаг, как показано ниже:[start:end:step].
Если мы не передаем start, то он считается равным 0.
Если мы не передаем end, то он считается равным длине массива в соответствующем измерении.
Если мы не передаем step, то он считается равным 1.

Давайте рассмотрим конкретный пример операции:

>>> import numpy as np
>>> arr = np.array([1, 2, 3, 4, 5, 6, 7])
>>> print(arr[1:5]) # Срез с индекса 1 до индекса 5
[2 3 4 5]
>>> print(arr[4:]) # Срез с индекса 4 до конца массива
[5 6 7]
>>> print(arr[:4]) # Срез с начала до индекса 4 (не включая)
[1 2 3 4]

Отрицательный срез

Использование знака минус для ссылки на индексы от конца:

Срез с индекса 3 до индекса 1 от конца массива:

>>> import numpy as np
>>> arr = np.array([1, 2, 3, 4, 5, 6, 7])
>>> print(arr[-3:-1])
[5 6]

Шаг step

Использование значения step для определения шага среза

>>> import numpy as np
>>> arr = np.array([1, 2, 3, 4, 5, 6, 7])
>>> print(arr[1:5:2]) # Возврат элементов с индекса 1 до индекса 5 с шагом 2
[2 4]
>>> print(arr[::2]) # Возврат элементов с шагом 2
[1 3 5 7]

Срез 2-D массива

Срез элементов с второго элемента до индекса 1 до индекса 4 (не включая):

>>> import numpy as np
>>> arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
>>> print(arr[1, 1:4]) # Срез элементов с второго элемента до индекса 1 до индекса 4 (не включая)
[7 8 9]
>>> print(arr[0:2, 2]) # Возврат индекса 2 из двух элементов
[3 8]
>>> print(arr[0:2, 1:4]) # Срез индексов 1 до индекса 4 (не включая), это вернет двумерный массив
[[2 3 4]
 [7 8 9]

NumPy предоставляет больше способов индексации, чем обычные Python-серии. Помимо индексации с использованием целых чисел и срезов, массивы могут быть индексированы с помощью массивов целых чисел, логических индексов и фантазийных индексов.

Индекс массива целых чисел

Данный пример��取 элементы из позиций (0,0), (1,1) и (2,0) в массиве.

>>> 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]

Данный пример��取 элементы из четырех углов 4x3 массива. Индексы строк [0,0] и [3,3], а индексы столбцов [0,2] и [0,2].

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

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

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> b = a[1:3, 1:3]
>>> c = a[1:3, [1, 2]]
>>> d = a[..., 1:]
>>> print(b)
[[5 6]
 [8 9]
>>> print(c)
[[5 6]
 [8 9]
>>> print(d)
[[2 3]
 [5 6]
 [8 9]

Булевы индексы

Мы можем использовать булев массив для индексации целевого массива.
Булевы индексы позволяют получить массив элементов, соответствующих заданным условиям, через булевы операции (например, сравнительные операторы).
Данный пример��取 элементов, превышающих 5:

>>> import numpy as np
>>> x = np.array([[0 1 2], [3 4 5], [6 7 8], [9 10 11]])
>>> print(x)
[[0 1 2]
 [3 4 5]
 [6 7 8]
 [9 10 11]
>>> print(x[x > 5])  # Теперь мы будем выводить элементы, превышающие 5
[6 7 8 9 10 11]

Данный пример использует ~ (оператор комплемента) для фильтрации значений 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.]

Данный пример демонстрирует, как удалить из массива элементы, не являющиеся комплексными числами.

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

Фancy indexing

Фancy indexing
Фancy indexing основан на использовании целочисленных массивов для индексации. Для использования одномерного целочисленного массива в качестве индекса, если目标是 одномерный массив, то результат индексации будет элементом, соответствующим его положению; если目标是 двумерный массив, то это будет строка, соответствующая индексу.
Фancy indexing не похож на срезы, он всегда копирует данные в новый массив.

>>> import numpy as np
>>> x=np.arange(32).reshape((8,4))
>>> print (x[[4,2,1,7]]) # 传入顺序索引数组
[[16 17 18 19]
 [ 8 9 10 11]
 [ 4 5 6 7]
 [28 29 30 31]]
>>> print (x[[-4,-2,-1,-7]]) # 传入倒序索引数组
[[16 17 18 19]
 [24 25 26 27]
 [28 29 30 31]
 [ 4 5 6 7]]
>>> print (x[np.ix_([1,5,7,2],[0,3,1,2])]) # 传入多个索引数组(要使用np.ix_)
[[ 4 7 5 6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11 9 10]]