Ich versuche derzeit die for-Schleifen in diesem Code Chunk mit vektorisiert Operationen in Numpy zu ersetzen:Vectorized Element Zuordnung Vergleiche zwischen den Matrizen in Numpy denen
def classifysignal(samplemat, binedges, nbinmat, nodatacode):
ndata, nsignals = np.shape(samplemat)
classifiedmat = np.zeros(shape=(ndata, nsignals))
ncounts = 0
for i in range(ndata):
for j in range(nsignals):
classifiedmat[i,j] = nbinmat[j]
for e in range(nbinmat[j]):
if samplemat[i,j] == nodatacode:
classifiedmat[i,j] == nodatacode
break
elif samplemat[i,j] <= binedges[j, e]:
classifiedmat[i,j] = e
ncounts += 1
break
ncounts = float(ncounts/nsignals)
return classifiedmat, ncounts
Allerdings bin ich ein wenig Probleme, Konzeptionierung wie man die dritte for-Schleife ersetzt (dh diejenige, die mit for e in range(nbinmat[j])
beginnt, da man vor dem Zuweisen eines Wertes einzelne Elemente zweier getrennter Matrizen vergleicht, wobei die Indizes dieser Elemente (i und e) vollständig voneinander entkoppelt sind) eine einfache Möglichkeit, dies mit ganzen Array-Operationen zu tun, oder wäre es am besten, mit For-Loops zu bleiben?
PS: Meine erste Stackoverflow-Frage. Wenn etwas unklar ist/weitere Details benötigt werden, lass es mich wissen! Vielen Dank.
Warum haben Sie die erste "if" -Anweisung innerhalb für Schleife über den Bereich (nbinmat [j]) gesetzt? Ich sehe nichts hängt davon ab e drin? Außerdem sollte "classifiedmat [i, j] == nodatacode" nicht "classifiedmat [i, j] = nodatacode" sein? – minhduc
Das Problem ist wirklich in der Elif-Klausel, wie Sie sagen. Vielleicht könnte dieser Code nicht vollständig neu geschrieben werden (einige Teile können das aber), aber vielleicht kann das "größere Bild"? Wenn Sie etwas Licht auf das werfen könnten, was Sie eigentlich tun möchten (woher kommt "Binedges", warum müssen Sie jedes einzelne Element eines Arrays mit Elementen in einem möglicherweise gestaffelten Array vergleichen), dann ist vielleicht mehr Hilfe verfügbar. –