2016-03-23 10 views
0

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.

+1

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

+0

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. –

Antwort

0

Ohne einige konkrete Beispiele und Erklärungen ist es schwer (oder zumindest funktioniert es), herauszufinden, was Sie gerade in der inneren Schleife zu tun versuchen. Also lassen Sie uns ein paar Stücke angehen und versuchen, sie zu vereinfachen

In [59]: C=np.zeros((3,4),int) 
In [60]: N=np.arange(4) 
In [61]: C[:]=N 
In [62]: C 
Out[62]: 
array([[0, 1, 2, 3], 
     [0, 1, 2, 3], 
     [0, 1, 2, 3]]) 

bedeutet, dass classifiedmat[i,j] = nbinmat[j] kann aus den Schlaufen

classifiedmat = np.zeros(samplemat.shape) 
classifiedmat[:] = nbinmat 

und

In [63]: S=np.arange(12).reshape(3,4) 
In [64]: C[S>8]=99 
In [65]: C 
Out[65]: 
array([[ 0, 1, 2, 3], 
     [ 0, 1, 2, 3], 
     [ 0, 99, 99, 99]]) 

schlägt bewegt werden, dass

if samplemat[i,j] == nodatacode: 
    classifiedmat[i,j] == nodatacode 

könnte ersetzt werden mit

Ich habe nicht ausgearbeitet, ob Loop und Pause diesen Ersatz ändert oder nicht.

ein mögliches Modell für innere Schleife ist:

In [86]: S[:,:,None]<=B[None,:,:] 
Out[86]: 
array([[[ True, True], 
     [ True, True], 
     [ True, True], 
     [ True, True]], 

     [[False, False], 
     [False, False], 
     [False, False], 
     [False, False]], 

     [[False, False], 
     [False, False], 
     [False, False], 
     [False, False]]], dtype=bool) 

Die Tatsache, dass die Sie iterieren:

for e in range(nbinmat[j]): 

In [83]: B=np.array((np.arange(4),np.arange(2,6))).T 
In [84]: for e in range(2): 
    C[S<=B[:,e]]=e 
    ....:  
In [85]: C 
Out[85]: 
array([[ 1, 1, 1, 1], 
     [ 0, 1, 2, 3], 
     [ 0, 99, 99, 99]]) 

Sie auch alle Werte von S und B mit vergleichen könnte

kann all diese Äquivalenzen werfen. Ich werde nicht versuchen, seine Bedeutung herauszufinden. Aber vielleicht habe ich dir ein paar Ideen gegeben.

+0

danke für die Hilfe! es hat mir definitiv einige Ideen gegeben, mit denen ich arbeiten konnte. –

-1

Nun, wenn Sie Vektoroperationen verwenden möchten, müssen Sie das Problem mithilfe der linearen Algebra lösen. Ich kann das Problem für Sie nicht überdenken, aber der allgemeine Ansatz, den ich nehmen würde, ist so etwas wie:

  • res = subtrahieren samplemat von binedges
  • res = in res Normalisieren Werte 0 und 1 (Verwendung Clip?). das heißt, wenn> 0, dann 1 sonst 0
  • nCount = Summe (res)
  • classifiedMat = res * binedges

Und so weiter.

Verwandte Themen