2014-12-13 19 views
6

Il mio modo di capire come funziona realmente la funzione Numpy.correlate(), ottengo alla sua implementazione in puro Python, ma quello che ho visto è stato molto deludente:In che modo multiarray.correlate2 (a, v, mode) viene effettivamente implementato?

def correlate(a, v, mode='valid', old_behavior=False): 
    mode = _mode_from_name(mode) 
    if old_behavior: 
     warnings.warn("""Warning.""", DeprecationWarning) 
     return multiarray.correlate(a, v, mode) 
    else: 
     return multiarray.correlate2(a, v, mode) 

così ho iniziato a cercare implementazione della funzione multiarray.correlate2(a, v, mode), ma sfortunatamente non riesco a trovarlo. Devo solo dire che lo sto cercando, perché cerco di implementare la funzione di autocorrelazione da solo, e mi manca la funzionalità simile al parametro mode='full' in Numpy.correlate() che rende la funzione per restituire il risultato come un array 1D. Grazie per l'aiuto in anticipo.

risposta

7

La velocità del codice Python può essere molto scarsa rispetto ad altri linguaggi come c. numpy mira a fornire operazioni altamente performanti sugli array, pertanto gli sviluppatori hanno deciso di implementare alcune operazioni in c.

Purtroppo, non troverà un'implementazione pitone di correlate in numpy 's base di codice, ma se si ha familiarità con C e python' s moduli di estensione, si può avere trovare il codice relativo here.

Le diverse modalità specificano solo la lunghezza della matrice di output. Si possono simulare trasformando gli ingressi:

import numpy as np 
a = [1, 2, 3] 
v = [0, 1, 0.5] 
np.correlate(a, v, mode="full") 

rendimenti:

array([ 0.5, 2. , 3.5, 3. , 0. ]) 

si può ottenere lo stesso risultato riempiendo v con zeri:

np.correlate(a, [0, 0] + v + [0, 0]) 

restituisce lo stesso risultato:

array([ 0.5, 2. , 3.5, 3. , 0. ]) 
+0

Grazie. Potresti, inoltre, spiegare come funziona questa funzione 'correl2()' in modo da dare a 'mode = 'full'' un array? – bluevoxel

+2

@bluevoxel, capisci come funziona 'mode = valid'? Le altre due modalità specificano solo quanto è lungo l'array di output. È possibile calcolare la "correlazione incrociata" per le dimensioni di un array arbitrario. Ogni volta che la formula tenta di accedere a un indice non valido (ad es. 'V [-1]'), si dà per scontato che in questa posizione hai trovato un '0'. Si ottiene lo stesso risultato riempiendo 'v' di zeri da destra e da sinistra, fino a quando len (v ') == len (a) + len (v) + 1'. – cel

Problemi correlati