Forum: PC-Programmierung numpy: iterieren über array


von scumpy (Gast)


Lesenswert?

Das hier will ich numpy-mässig umsetzen wegen speed:

1
import numpy as np
2
3
a=np.arange(12).reshape(4,3)  # ein np.array
4
5
print("unser array")
6
print(a)
7
print()
8
9
# Wie kann ich das hier np-mässig umsetzen?
10
print("so will ich es haben aber mit numpy iteriert")
11
for i in a:
12
  print (i)  # nur zur visualisierung
13
  a,b,c=i
14
  #mach was komplexes mit a,b,c

Ich will also je iterationsschritt die Zeile bzw. drei Werte auf einmal 
haben.

Egal was ich nutze:
ndenumerate, multi_index, external_loop, bekomme ich immer ein
array-Element je Iterationsschritt.

Mit apply_along_axis und nem Callback geht es aber das nutzt intern auch 
for-loop was als langsam gilt. Ich will das schneller machen.

Wie macht man das mit numpy?

von M.K. B. (mkbit)


Lesenswert?

Ich würde dann manuell iterierten mit iter() und next(). Mit next in der 
Schleife kannst du dann mehrere Werte lesen.

Was machst du, wenn die Anzahl im Array kein Vielfaches von 3 ist?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Als Erstes würde ich a,b,c in x,y,z umbenennen, weil durch eine
Zuweisung an a das Array verloren gehen würde.

Was danach kommt, hängt stark davon ab, was das "komplexe" genau ist.

Hast du vielleicht ein Beispiel?

von Sven B. (scummos)


Lesenswert?

Bei "for i in a" hast du schon verloren. Du musst die "komplexe" 
Operation vektorisieren. Wie das geht, kommt darauf an, was sie ist. Die 
meisten np.xyz-Funktionen wie np.sin, etc arbeiten auf Arrays; viele der 
Vektorfunktionen wie np.fft können Arrays von Vektoren (mit axis=...); 
für einige wirre Anforderungen, wie Listen von Matritzen mit Listen von 
Vektoren zu multiplizieren gibt es np.einsum; etc. Kommt halt drauf an.

von scumpy (Gast)


Lesenswert?

Ja das mit dem a,b,c = i ist nat. ein Fehler wenn das array a heisst.

"Komplex" ist aktuell dass ich einen Vergleich über x,y,z untereinander 
machen muss, x, y, z mussen innerhalb eines Bereiches liegen, je nachdem 
ob das der Fall ist wird ein anderes array b mit neuen werten für x,y,z 
erzeugt.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Also bspw. etwas in der Art:

1
import numpy as np
2
3
a=np.arange(12).reshape(4,3)  # ein np.array
4
print('a =\n', a)
5
6
# a in die Vektoren x, y und z zerlegen
7
x, y, z = a.T
8
9
# komplexer Ausdruck mit Fallunterscheidung und Rechenoperationen
10
s = np.where(4*x > 3*y, z+1, 2*z)
11
12
print('s =\n', s)

Ausgabe:

1
a =
2
 [[ 0  1  2]
3
 [ 3  4  5]
4
 [ 6  7  8]
5
 [ 9 10 11]]
6
s =
7
 [ 4 10  9 12]

: Bearbeitet durch Moderator
von scumpy (Gast)


Lesenswert?

Aha so geht das, danke.

Als ich nach einer Lösung gegoogled hatte bin ich auch über where 
gestolpert aber das Beispiel hier
https://stackoverflow.com/questions/33453748/python-how-to-loop-through-an-array-in-numpy-at-c-speed-and-store-some-positions

habe ich nicht so ganz verstanden, dass man den Ausdruck in eine 
Variable packen kann sieht seltsam aus.

von Yalu X. (yalu) (Moderator)


Lesenswert?

np.where ist die vektorielle Variante der "conditional expression" in
Python. Die folgenden beiden Anweisungen tun prinzipiell dasselbe, nur
dass die zweite auch auf Vektoren anwendbar ist:
1
  result = trueValue if condition else falseValue
2
3
  result = np.where(condition, trueValue, falseValue)

Der Code in meinem letzten Beitrag würde in Schleifenform also so
aussehen:

1
import numpy as np
2
3
a = np.arange(12).reshape(4,3)
4
print('a =\n', a)
5
6
s = np.empty(len(a), a.dtype)
7
8
for i, (x, y, z) in enumerate(a):
9
  s[i] = z+1 if 4*x > 3*y else 2*z
10
11
print('s =\n', s)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.