Domanda

Sono nuovo di python, scuse se questo è stato chiesto già.

Utilizzando pitone e NumPy, sto cercando di raccogliere dati attraverso molti file NetCDF in un singolo array iterativo chiamando append().

Ingenuamente, sto cercando di fare qualcosa di simile:

from numpy import *
from pupynere import netcdf_file

x = array([])
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x = append(x, xFragment)

Lo so che in circostanze normali questa è una cattiva idea, dal momento che riassegna nuova memoria per ogni chiamata append(). Ma due cose scoraggiano preallocazione di x:

1) I file non sono necessariamente le stesse dimensioni lungo l'asse 0 (ma dovrebbe essere la stessa dimensione lungo assi successivi), quindi avrei bisogno di leggere le dimensioni della matrice di ciascun file in anticipo per precalculate la dimensione finale x.

Tuttavia ...

2) Da quello che posso dire, pupynere (e altri moduli NetCDF) caricare l'intero file in memoria all'apertura del file, piuttosto che un riferimento (ad esempio molti moduli NetCDF in altri ambienti). Così a riservare, avrei dovuto aprire i file due volte.

Ci sono molti (> 100) di grandi dimensioni (> 1GB) file, così overallocating e rimodellare non è pratico, da quello che posso dire.

La mia prima domanda è se mi manca qualche modo intelligente per preallocare.

La mia seconda domanda è più grave. Il ritaglio qua sopra funziona per un array monodimensionale. Ma se provo a caricare in una matrice, quindi inizializzazione diventa un problema. Posso aggiungere un array monodimensionale ad un array vuoto:

append( array([]), array([1, 2, 3]) )

ma non posso aggiungere un array vuoto ad una matrice:

append( array([]), array([ [1, 2], [3, 4] ]), axis=0)

Qualcosa di simile x.extend (xFragment) avrebbe funzionato, credo, ma non credo che gli array NumPy dispongono di questa funzionalità. Potrei anche evitare il problema di inizializzazione trattando il primo file come un caso speciale, ma io preferirei evitare che se c'è un modo migliore per farlo.

Se qualcuno in grado di offrire aiuto o un suggerimento, oppure può identificare un problema con il mio approccio, allora sarei grato. Grazie

È stato utile?

Soluzione

Si può risolvere i due problemi di primo caricamento matrici dai file di file in una lista di array, e quindi utilizzando concatenate ad unirsi a tutti gli array. Qualcosa di simile a questo:

x = [] # a normal python list, not np.array
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x.append(xFragment)

combined_array = concatenate(x, axis=0)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top