English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В 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 для определения шага среза
>>> 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]
Срез элементов с второго элемента до индекса 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 не похож на срезы, он всегда копирует данные в новый массив.
>>> 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]]