numpy: iterieren über array

Gast #5735292
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?
#5735383
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.
Gast #5735508
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.
Moderator #5735549
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]
Moderator #5737145
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren