Itération sur les tableaux NumPy

L'objet itérateur NumPy numpy.nditer offre un moyen flexible d'accéder à un ou plusieurs éléments de tableau.

La tâche la plus élémentaire de l'itérateur est d'accéder aux éléments de tableau.

Ensuite, nous utilisons la fonction arange() pour créer un tableau 2X3, et utilisons nditer pour le parcourir.

Exemple

import numpy as np a = np.arange(6).reshape(2,3) print ('Le tableau original est :') print (a) print ('\n') print ('Itération sur les éléments :') for x in np.nditer(a): print (x, end=", " ) print ('\n')

Le résultat de sortie est:

原始数组是:
[[0 1 2]
 [3 4 5]]


迭代输出元素:
0, 1, 2, 3, 4, 5, 

Les exemples ci-dessus n'utilisent pas l'ordre standard C ou Fortran ; l'ordre choisi est cohérent avec la disposition mémoire du tableau, afin d'améliorer l'efficacité d'accès. Par défaut, il s'agit de l'ordre ligne-major (ou ordre C).

Cela reflète que, par défaut, chaque élément est simplement accédé sans tenir compte de son ordre spécifique. Nous pouvons le constater en itérant sur la transposée du tableau ci-dessus, et en la comparant avec la méthode copy qui accède à la transposée du tableau dans l'ordre C, comme dans l'exemple suivant :

Exemple

import numpy as np a = np.arange(6).reshape(2,3) for x in np.nditer(a.T): print (x, end=", " ) print ('\n') for x in np.nditer(a.T.copy(order='C')): print (x, end=", " ) print ('\n')

Le résultat de sortie est:

0, 1, 2, 3, 4, 5, 

0, 3, 1, 4, 2, 5, 

Comme on peut le voir dans les exemples ci-dessus, l'ordre de parcours de a et a.T est le même, ce qui signifie qu'ils ont également le même ordre de stockage en mémoire, maisa.T.copy(order = 'C')a un résultat de parcours différent, car sa méthode de stockage est différente des deux précédents, et par défaut il est accédé par lignes.

Contrôle de l'ordre de parcours

  • for x in np.nditer(a, order='F'):Ordre Fortran, c'est-à-dire ordre en colonnes;
  • for x in np.nditer(a.T, order='C'):Ordre C, c'est-à-dire ordre en lignes;

Exemple

import numpy as np a = np.arange(0,60,5) a = a.reshape(3,4) print ('Le tableau d'origine est:') print (a) print ('\n') print ('La transposée du tableau d'origine est:') b = a.T print (b) print ('\n') print ('Dans l'ordre de style C:') c = b.copy(order='C') print (c) for x in np.nditer(c): print (x, end=", " ) print ('\n') print ('Dans l'ordre de style F:') c = b.copy(order='F') print (c) for x in np.nditer(c): print (x, end=", " )

Le résultat de sortie est:

原始数组是:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


原始数组的转置是:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]


以 C 风格顺序排序:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]
0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55, 

以 F 风格顺序排序:
[[ 0 20 40]
 [ 5 25 45]
 [10 30 50]
 [15 35 55]]
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55,

Vous pouvez forcer l'objet nditer à utiliser un certain ordre en le définissant explicitement:

Exemple

import numpy as np a = np.arange(0,60,5) a = a.reshape(3,4) print ('Le tableau d'origine est:') print (a) print ('\n') print ('Dans l'ordre de style C:') for x in np.nditer(a, order = 'C'): print (x, end=", " ) print ('\n') print ('Dans l'ordre de style F:') for x in np.nditer(a, order = 'F'): print (x, end=", " )

Le résultat de sortie est:

原始数组是:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


以 C 风格顺序排序:
0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 

以 F 风格顺序排序:
0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55,

Modification des valeurs des éléments du tableau

L'objet nditer possède un autre paramètre optionnel, op_flags. Par défaut, nditer traite le tableau à parcourir comme étant en lecture seule. Pour modifier les valeurs des éléments du tableau pendant l'itération, vous devez spécifier le mode readwrite ou writeonly.

Exemple

import numpy as np a = np.arange(0,60,5) a = a.reshape(3,4) print ('Le tableau d'origine est:') print (a) print ('\n') for x in np.nditer(a, op_flags=['readwrite']): x[...]=2*x print ('Le tableau modifié est :') print (a)

Le résultat de sortie est:

原始数组是:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


修改后的数组是:
[[  0  10  20  30]
 [ 40  50  60  70]
 [ 80  90 100 110]]

Utilisation d'une boucle externe

Le constructeur de la classe nditer possède un paramètre flags, qui peut accepter les valeurs suivantes :

Paramètre Description
c_index Peut suivre l'index dans l'ordre C
f_index Peut suivre l'index dans l'ordre Fortran
multi_index Peut suivre un seul type d'index par itération
external_loop La valeur donnée est un tableau unidimensionnel avec plusieurs valeurs, plutôt qu'un tableau à zéro dimension

Dans l'exemple ci-dessous, l'itérateur parcourt en correspondance avec chaque colonne et les combine en un tableau unidimensionnel.

Exemple

import numpy as np a = np.arange(0,60,5) a = a.reshape(3,4) print ('Le tableau d'origine est:') print (a) print ('\n') print ('Le tableau modifié est :') for x in np.nditer(a, flags = ['external_loop'], order = 'F'): print (x, end=", " )

Le résultat de sortie est:

原始数组是:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


修改后的数组是:
[ 0 20 40], [ 5 25 45], [10 30 50], [15 35 55],

Itération de diffusion

Si deux tableaux sont diffusables, l'objet de combinaison nditer peut les parcourir simultanément. Supposons que le tableau a ait les dimensions 3X4 et le tableau b les dimensions 1X4, alors l'itérateur suivant est utilisé (le tableau b est diffusé à la taille de a).

Exemple

import numpy as np a = np.arange(0,60,5) a = a.reshape(3,4) print ('Le premier tableau est :') print (a) print ('\n') print ('Le deuxième tableau est :') b = np.array([1, 2, 3, 4], dtype = int) print (b) print ('\n') print ('Le tableau modifié est :') for x,y in np.nditer([a,b]): print ("%d:%d" % (x,y), end=", " )

Le résultat de sortie est:

第一个数组为:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


第二个数组为:
[1 2 3 4]


修改后的数组为:
0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4,
Autres extensions