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?
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?
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?
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.
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.
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=trueValueifconditionelsefalseValue
2
3
result=np.where(condition,trueValue,falseValue)
Der Code in meinem letzten Beitrag würde in Schleifenform also so
aussehen: