NumPy - Iterieren über Array
Das NumPy-Paket enthält ein Iteratorobjekt numpy.nditer. Es ist ein effizientes mehrdimensionales Iteratorobjekt, mit dem über ein Array iteriert werden kann. Jedes Element eines Arrays wird über die Standard-Iterator-Schnittstelle von Python besucht.
Lassen Sie uns ein 3X4-Array mit der Funktion arange () erstellen und mit iterieren nditer.
Beispiel 1
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Modified array is:'
for x in np.nditer(a):
print x,
Die Ausgabe dieses Programms ist wie folgt:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Modified array is:
0 5 10 15 20 25 30 35 40 45 50 55
Beispiel 2
Die Reihenfolge der Iteration wird so gewählt, dass sie mit dem Speicherlayout eines Arrays übereinstimmt, ohne eine bestimmte Reihenfolge zu berücksichtigen. Dies kann durch Iterieren über die Transponierte des obigen Arrays gesehen werden.
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Transpose of the original array is:'
b = a.T
print b
print '\n'
print 'Modified array is:'
for x in np.nditer(b):
print x,
Die Ausgabe des obigen Programms ist wie folgt:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Transpose of the original array is:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
Modified array is:
0 5 10 15 20 25 30 35 40 45 50 55
Iterationsreihenfolge
Wenn dieselben Elemente in der Reihenfolge F gespeichert werden, wählt der Iterator die effizientere Methode zum Iterieren über ein Array.
Beispiel 1
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Transpose of the original array is:'
b = a.T
print b
print '\n'
print 'Sorted in C-style order:'
c = b.copy(order = 'C')
print c
for x in np.nditer(c):
print x,
print '\n'
print 'Sorted in F-style order:'
c = b.copy(order = 'F')
print c
for x in np.nditer(c):
print x,
Seine Ausgabe wäre wie folgt -
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Transpose of the original array is:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
Sorted in C-style order:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0 20 40 5 25 45 10 30 50 15 35 55
Sorted in F-style order:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0 5 10 15 20 25 30 35 40 45 50 55
Beispiel 2
Es ist möglich zu erzwingen nditer Einwände gegen die Verwendung einer bestimmten Reihenfolge durch ausdrückliche Erwähnung.
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Sorted in C-style order:'
for x in np.nditer(a, order = 'C'):
print x,
print '\n'
print 'Sorted in F-style order:'
for x in np.nditer(a, order = 'F'):
print x,
Seine Ausgabe wäre -
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Sorted in C-style order:
0 5 10 15 20 25 30 35 40 45 50 55
Sorted in F-style order:
0 20 40 5 25 45 10 30 50 15 35 55
Ändern von Array-Werten
Das nditer Objekt hat einen anderen optionalen Parameter namens op_flags. Der Standardwert ist schreibgeschützt, kann jedoch auf schreibgeschützt oder schreibgeschützt eingestellt werden. Dadurch können Array-Elemente mit diesem Iterator geändert werden.
Beispiel
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
for x in np.nditer(a, op_flags = ['readwrite']):
x[...] = 2*x
print 'Modified array is:'
print a
Seine Ausgabe ist wie folgt -
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Modified array is:
[[ 0 10 20 30]
[ 40 50 60 70]
[ 80 90 100 110]]
Externe Schleife
Der nditer-Klassenkonstruktor hat a ‘flags’ Parameter, der die folgenden Werte annehmen kann -
Sr.Nr. | Parameter & Beschreibung |
---|---|
1 | c_index Der C_order-Index kann verfolgt werden |
2 | f_index Der Fortran_order-Index wird verfolgt |
3 | multi-index Der Indextyp mit einem pro Iteration kann verfolgt werden |
4 | external_loop Bewirkt, dass die angegebenen Werte eindimensionale Arrays mit mehreren Werten anstelle eines nulldimensionalen Arrays sind |
Beispiel
Im folgenden Beispiel werden eindimensionale Arrays, die jeder Spalte entsprechen, vom Iterator durchlaufen.
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Modified array is:'
for x in np.nditer(a, flags = ['external_loop'], order = 'F'):
print x,
Die Ausgabe ist wie folgt -
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Modified array is:
[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]
Rundfunkiteration
Wenn zwei Arrays sind broadcastable, eine kombinierte nditerObjekt kann sie gleichzeitig durchlaufen. Angenommen, ein Arraya hat die Dimension 3X4 und es gibt ein anderes Array b der Dimension 1X4 wird der Iterator des folgenden Typs verwendet (Array b wird auf Größe von gesendet a).
Beispiel
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'First array is:'
print a
print '\n'
print 'Second array is:'
b = np.array([1, 2, 3, 4], dtype = int)
print b
print '\n'
print 'Modified array is:'
for x,y in np.nditer([a,b]):
print "%d:%d" % (x,y),
Seine Ausgabe wäre wie folgt -
First array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Second array is:
[1 2 3 4]
Modified array is:
0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4