English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
The NumPy iterator object numpy.nditer provides a flexible way to access one or more array elements.
The most basic task of an iterator is to access array elements.
Next, we use the arange() function to create a 2X3 array, and iterate over it using nditer.
import numpy as np a = np.arange(12).reshape(2,6) print ('Le tableau original est :') print (a) print (' ') print('Iterative output element:') for x in np.nditer(a): print (x, end=" ")
Le résultat de la sortie est :
The original array is as follows: [[ 0 1 2 3 4 5] [ 6 7 8 9 10 11]] Iterative output of array elements as follows: 0 1 2 3 4 5 6 7 8 9 10 11
The above example does not use standard C or Fortran order; the chosen order is consistent with the array memory layout, which is done to improve access efficiency, with the default being row-major (row-major order, or C-order).
This reflects that by default, only each element needs to be accessed without considering its specific order. We can see this by iterating over the transpose of the array and comparing it with the copy method that accesses the transpose of the array in C order, as shown in the following example:
import numpy as np a = np.arange(12).reshape(2,6) for x in np.nditer(a.T): print (x, end=" ") print (' ') for x in np.nditer(a.T.copy(order='C')): print (x, end=" ")
Le résultat de la sortie est :
0 1 2 3 4 5 6 7 8 9 10 11 0 6 1 7 2 8 3 9 4 10 5 11
À partir de l'exemple ci-dessus, on peut voir que la traversée de a et a.T est la même, c'est-à-dire qu'ils ont le même ordre de stockage en mémoire, mais a.T.copy(order = 'C') Les résultats de la traversée sont différents, car ils ne sont pas les mêmes que les deux premiers, car leur mode de stockage est différent, par défaut, c'est l'accès en ligne.
for x in np.nditer(a, order='F'):Fortran order, c'est-à-dire l'accès en premier lieu aux colonnes;for x in np.nditer(a.T, order='C'):C order, c'est-à-dire l'accès en premier lieu aux lignes;
import numpy as np a = np.arange(0,100,5) a = a.reshape(4,5) print ('Le tableau original est :') print (a) print (' ') print('La transposition de l'array originale est :') b = a.T print (b) print (' ') print('Trier en ordre de style C :') c = b.copy(order='C') print(c) for x in np.nditer(c): print (x, end=" ") print (' ') print('Trier en ordre de style F :') c = b.copy(order='F') print(c) for x in np.nditer(c): print (x, end=" ")
Le résultat de la sortie est :
Le tableau original est : [[ 0 5 10 15 20] [25 30 35 40 45] [50 55 60 65 70] [75 80 85 90 95]] La transposition de l'array originale est : [[ 0 25 50 75] [ 5 30 55 80] [10 35 60 85] [15 40 65 90] [20 45 70 95]] Trier en ordre de style C : [[ 0 25 50 75] [ 5 30 55 80] [10 35 60 85] [15 40 65 90] [20 45 70 95]] 0 25 50 75 5 30 55 80 10 35 60 85 15 40 65 90 20 45 70 95 Trier en ordre de style F : [[ 0 25 50 75] [ 5 30 55 80] [10 35 60 85] [15 40 65 90] [20 45 70 95]] 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95
Il est possible de forcer explicitement l'objet nditer à utiliser un certain ordre via la configuration :
import numpy as np a = np.arange(0,100,5) a = a.reshape(4,5) print ('Le tableau original est :') print (a) print (' ') print('Trier en ordre de style C :') for x in np.nditer(a, order='C'): print(x, end=', ', ) print (' ') print('Trier en ordre de style F :') for x in np.nditer(a, order='F'): print (x, end=" ")
Le résultat de la sortie est :
Le tableau original est : [[ 0 5 10 15 20] [25 30 35 40 45] [50 55 60 65 70] [75 80 85 90 95]] Trier en ordre de style C : 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, Trier en ordre de style F : 0 25 50 75 5 30 55 80 10 35 60 85 15 40 65 90 20 45 70 95
L'objet nditer a un autre paramètre optionnel op_flags. Par défaut, nditer considère le tableau à itérer comme un objet en lecture seule (read-only), pour modifier les valeurs des éléments du tableau pendant la traversée, il est nécessaire de spécifier read-write ou write-Mode only.
import numpy as np a = np.arange(0,100,5) a = a.reshape(4,5) print ('Le tableau original est :') print (a) print (' ') for x in np.nditer(a, op_flags=['readwrite']): x[...]=2*x print ('Le tableau modifié est :') print (a)
Le résultat de la sortie est :
Le tableau original est : [[ 0 5 10 15 20] [25 30 35 40 45] [50 55 60 65 70] [75 80 85 90 95]] Le tableau modifié est : [[ 0 10 20 30 40] [ 50 60 70 80 90] [100 110 120 130 140] [150 160 170 180 190]]
Le constructeur de la classe nditer possède un paramètre flags, qui peut accepter les valeurs suivantes :
Paramètres | Description |
c_index | Il peut suivre l'index d'ordre C. |
f_index | Il peut suivre l'index d'ordre Fortran. |
multi-index | Chaque itération peut suivre un type d'index. |
external_loop | Les valeurs fournies sont des tableaux unidimensionnels avec plusieurs valeurs, et non des tableaux zéro dimension. |
Dans l'exemple suivant, l'itérateur parcourt chaque colonne correspondante et les combine en un tableau unidimensionnel.
import numpy as np a = np.arange(0,100,5) a = a.reshape(4,5) print ('Le tableau original est :') print (a) print (' ') print ('Le tableau modifié est :') for x in np.nditer(a, flags = ['external_loop'], order = 'F'): print (x, end=" ")
Le résultat de la sortie est :
Le tableau original est : [[ 0 5 10 15 20] [25 30 35 40 45] [50 55 60 65 70] [75 80 85 90 95]] Le tableau modifié est : [ 0 25 50 75] [ 5 30 55 80] [10 35 60 85] [15 40 65 90] [20 45 70 95]
Si deux tableaux sont broadcastables, l'objet de combinaison nditer peut itérer en même temps. Supposons que la dimension du tableau a soit 3X4, la dimension du tableau b est 1X4 Si vous utilisez les itérateurs suivants (le tableau b est broadcasté à la taille de a).
import numpy as np a = np.arange(0,60,5) a = a.reshape(3,4) print ('Le premier tableau est :') print (a) print (' ') print ('Le second tableau est :') b = np.array([1, 2, 3, 4], dtype = int) print (b) print (' ') print ('Le tableau modifié est :') for x,y in np.nditer([a,b]): print ("%d:%d" % (x,y), end=" ")
Le résultat de la sortie est :
Le premier tableau est : [[ 0 5 10 15] [20 25 30 35] [40 45 50 55]] Le second tableau est : [1 2 3 4] Le tableau modifié est : 0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4,