2013-10-09 14 views
7

Ho un array numpy a 4 dimensioni (x, y, z, tempo) e vorrei fare un numpy.polyfit attraverso la dimensione temporale, a ciascuna coordinata x, y, z . Per esempio:Regressione lungo una dimensione in una matrice numpy

import numpy as np 
n = 10  # size of my x,y,z dimensions 
degree = 2 # degree of my polyfit 
time_len = 5 # number of time samples 

# Make some data 
A = np.random.rand(n*n*n*time_len).reshape(n,n,n,time_len) 

# An x vector to regress through evenly spaced samples 
X = np.arange(time_len) 

# A placeholder for the regressions 
regressions = np.zeros(n*n*n*(degree+1)).reshape(n,n,n,degree+1) 

# Loop over each index in the array (slow!) 
for row in range(A.shape[0]) : 
    for col in range(A.shape[1]) : 
     for slice in range(A.shape[2]): 
      fit = np.polyfit(X, A[row,col,slice,:], degree) 
      regressions[row,col,slice] = fit 

Mi piacerebbe arrivare alla matrice regressions, senza dover passare attraverso tutto il looping. È possibile?

+1

[Questa risposta] (http://stackoverflow.com/a/16315330/832621) fornisce un esempio di un problema simile al tuo ... –

+2

@SaulloCastro sicuro - ma questa risposta non acquista ancora alcun vantaggio in termini di prestazioni su un normale loop Python, che è più leggibile IMO –

risposta

9

Rimodellare i dati in modo che ogni singola sezione si trovi su una colonna di un array 2D. Quindi esegui polyfit una volta.

A2 = A.reshape(time_len, -1) 
regressions = np.polyfit(X, A2, degree) 
regressions = regressions.reshape(A.shape) 

O qualcosa del genere ... io non capisco quello che tutte le dimensioni corrispondono al set di dati, quindi non so esattamente quale forma che si vuole. Ma il punto è, ogni singolo set di dati per polyfit dovrebbe occupare una colonna nella matrice A2.

A proposito, se sei interessato alle prestazioni, dovresti profilare il tuo codice usando il modulo profilo o qualcosa del genere. In generale, non è sempre possibile prevedere la velocità con cui il codice verrà eseguito semplicemente osservandolo. Devi eseguirlo. Anche se in questo caso la rimozione dei loop renderà il tuo codice 100x più leggibile, il che è ancora più importante.

+2

+1 questa è una soluzione molto migliore dell'utilizzo di 'apply_along_axis',' vectorize' o 'apply_over_axes', poiché in realtà vettorializza l'operazione a livello del codice C –

+2

Questo grazioso molto lavorato Ho scoperto che avevo bisogno di 'A2 = A.T.reshape (time_len, -1)' e 'regressions = regressions.T.reshape ((n, n, n, degree + 1))' – ajwood

Problemi correlati