2017-05-18 4 views
0

Slice ist ein leistungsfähiger Zugriffsindex für Elemente eines Arrays, das in numpy verfügbar ist. Diese Lösung ist eine der effizientesten. Das Bild ist zunächst mit Nullen erstellen und dann mit denen auf geraden Linien gefüllt und dann auf ungeraden Zeilen, scannen Sie immer das Bild alle zwei Pixel.Verbesserte Slicefunktion (numpy)

Implementieren Sie eine Isccsym-Funktion mit Slice und behandeln Sie komplexe Arrays. Denken Sie daran, dass es ausreicht, die Hälfte des Arrays zu testen, denn wenn F(a)==F(-a) ist, müssen Sie F(-a) nicht erneut mit F(a) vergleichen.

def isccsym(F): 

    G = np.copy(F) 
    G[0,0] = np.conjugate(F[0,0]) 
    G[0,1:] = np.conjugate(F[0,:0:-1]) 
    G[1:,0] = np.conjugate(F[:0:-1,0]) 
    G[1:,1:] = np.conjugate(F[1:,1:][::-1,::-1]) 

    if G.dtype == np.complex: 
     Gaux = np.sum(([G.imag])) 

    return (abs(F-G)< 10E-4).all() 

Kann mir jemand helfen? Ich muss ihre Bearbeitungszeit noch weiter verbessern.

Antwort

0

Es ist möglich, die gesamte G Matrix auf einmal zu erzeugen, nicht durch Teile. Das sollte Ihre Operation zumindest ein bisschen beschleunigen. Ferner wird die Berechnung der Gaux nicht für alles verwendet und deshalb entfernt werden kann, was zu:

def isccsym(F): 
    G = F.conj().T 
    return (abs(F-G) < 10E-4).all() 

Allerdings ist diese Umsetzung nicht Scheibe verwenden.

Für eine Lösung, die die relevanten Elemente überprüft Scheiben und das wird nur verwendet, gemäß der gegebenen Hinweis, es möglich ist, zu tun:

def isccsym(F): 
    row, col = F.shape 
    sym = (row == col) 
    while sym and row > 0: 
     row -= 1 
     sym = (abs(F[row, row:] - F[row:, row].conj()) < 10e-4).all() 
    return sym 
+0

Vielen Dank, Ihr du hast Recht, sondern weil Sie kann nur schneiden, ist nicht praktikabel zu verwenden, aber ich werde das später verwenden. – wgrt

+0

@Arlequina Ich habe die Antwort mit einer Lösung aktualisiert, die den gegebenen Anforderungen entspricht, soweit ich das verstehe. – JohanL

Verwandte Themen