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