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

Tronçons des tableaux NumPy

Coupe d'array

Dans Python, couper signifie prendre des éléments d'un index donné à un autre index donné.
Nous transmettons une coupe plutôt qu'un index de cette manière :[start:end].
Nous pouvons également définir l'incrément, comme suit :[start:end:step].
Si nous ne passons pas start, il est considéré comme 0.
Si nous ne passons pas end, cela est considéré comme la longueur de l'array dans cette dimension.
Si nous ne passons pas step, cela est considéré comme 1.

Voici un exemple concret de l'opération

>>> import numpy as np
>>> arr = np.array([1, 2, 3, 4, 5, 6, 7])
>>> print(arr[1:5]) # Couper l'index 1 到索引 5 des éléments
[2 3 4 5]
>>> print(arr[4:]) # Couper l'index de l'array 4 aux éléments de la fin
[5 6 7]
>>> print(arr[:4]) # Couper à partir de l'index de départ 4l'élément (non inclus)
[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 4]
>>> print(arr[::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-D 数组
[[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[[1,2],1,0]] 
>>> print(y)
[1 4 5]

以下实例获取了 4X3 数组中的四个角的元素。行索引是 [3,3]],而列索引是 [2]],而列索引是 [2]]。

>>> import numpy as np
>>> x = np.array([ 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([3,3]]
>>> cols = np.array([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([ 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]]) # Nous allons maintenant imprimer ceux qui sont supérieurs }} 5 des éléments
[ 6 7 8 9 10 11]

L'exemple suivant utilise ~ (opérateur de complément) pour filtrer 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. 5j])

L'exemple suivant montre comment filtrer les éléments non complexes d'un tableau.

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

Indexage fancy

L'indexage fancy fait usage de tableaux d'entiers.
L'indexage fancy prend les valeurs des tableaux d'indices comme des indices d'une axe du tableau cible. Pour utiliser un tableau d'entiers unidimensionnel comme index, si le cible est un tableau unidimensionnel, alors le résultat de l'index est l'élément correspondant à la position ; si le cible est un tableau bidimensionnel, alors c'est la ligne correspondant à l'index.
L'indexage fancy est différent des tronçons, il copie toujours les données dans un nouveau tableau.

>>> import numpy as np
>>> x=np.arange(32).reshape((8,4))
>>> print (x[[4,2,1,7]]) # Transmission de tableaux d'indices ordonnés
[[16 17 18 19]
 [ 8 9 10 11]
 [ 4 5 6 7]
 [28 29 30 31]]
>>> print (x[[-4,-2,-1,-7]]) # Transmission de tableaux d'indices inversés
[[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]]) # Transmission de plusieurs tableaux d'indices (utilisez np.ix_)
[[ 4 7 5 6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11 9 10]]