Ho scritto del codice in Python che funziona bene ma è molto lento; Penso a causa dei cicli for. Spero che si possano accelerare le seguenti operazioni usando i comandi di numpy. Fammi definire l'obiettivo.vettorizzazione numpy invece che per loop
Supponiamo di disporre di un array numpy 2D all_CMs
di dimensioni row
x col
. Ad esempio, considera una matrice 6
x 11
(vedi disegno sotto).
voglio calcolare la media per tutte le righe, cioè somma ⱼ aᵢⱼ risultato un array. Questo, ovviamente, può essere fatto facilmente. (Chiamo questo valore
CM_tilde
)Ora, per ogni fila voglio calcolare la media di alcuni valori selezionati, ovvero tutti i valori di sotto di una certa soglia calcolando la somma e dividendolo per il numero di tutte le colonne (
N
). Se il valore supera questa soglia definita, viene aggiunto il valoreCM_tilde
(media dell'intera riga). Questo valore è chiamatoCM
Successivamente, il valore
CM
viene sottratto da ciascun elemento della riga
Inoltre voglio avere una matrice NumPy o lista in cui sono elencati tutti quei CM
valori .
La figura:
Il seguente codice funziona, ma molto lento (soprattutto se gli array ricevendo grande)
CM_tilde = np.mean(data, axis=1)
N = data.shape[1]
data_cm = np.zeros((data.shape[0], data.shape[1], data.shape[2]))
all_CMs = np.zeros((data.shape[0], data.shape[2]))
for frame in range(data.shape[2]):
for row in range(data.shape[0]):
CM=0
for col in range(data.shape[1]):
if data[row, col, frame] < (CM_tilde[row, frame]+threshold):
CM += data[row, col, frame]
else:
CM += CM_tilde[row, frame]
CM = CM/N
all_CMs[row, frame] = CM
# calculate CM corrected value
for col in range(data.shape[1]):
data_cm[row, col, frame] = data[row, col, frame] - CM
print "frame: ", frame
return data_cm, all_CMs
Tutte le idee?
Nel passaggio 2, si sostituisce essenzialmente qualsiasi valore che è superiore alla soglia dal CM_tilde, e quindi * * calcolare la media su tutta la fila, compresi i valori sostituiti? – Evert
Inizia usando 'np.where' per sostituire il ciclo for. Quindi, utilizzando la trasmissione, è possibile rimuovere i 2 anelli esterni. Vedere la documentazione di [dove] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.where.html) – mtadd