2011-02-01 8 views
10

Sto cercando di utilizzare Clojure e Incanter per l'elaborazione di un grande set di dati scientifici; in particolare, la versione a 0,5 gradi di this dataset (disponibile solo in formato binario).Manipolazione di set di dati scientifici in Clojure - lettura di ByteBuffers in matrici

La mia domanda è: quali raccomandazioni avete per modi eleganti di affrontare questo problema in Java/Clojure? C'è un modo semplice per ottenere questo set di dati in Incanter o in qualche altro pacchetto java matrix?

sono riuscito a leggere i dati binari in una java.nio.ByteBuffer utilizzando il seguente codice:

(defn to-float-array [^String str] 
    (-> (io/to-byte-array (io/to-file str)) 
     java.nio.ByteBuffer/wrap 
     (.order java.nio.ByteOrder/LITTLE_ENDIAN))) 

Ora, sono davvero alle prese con come posso iniziare a manipolare questo ByteBuffer come un array. Sto usando il NumPy di ​​Python, che rende molto facile manipolare questi enormi set di dati. Ecco il codice python per quello che sto cercando di fare:

// reshape row vector into (time, lat_slices, lon_slices) 
// then cut out every other row 
rain_data = np.fromfile("path/to/file", dtype="f") 
rain_data = rain_data.reshape(24, 360, 720); 
rain_data = rain_data[0:23:2,:,:]; 

Dopo questo affettare, voglio tornare un vettore di questi dodici array. (Devo manipolarli separatamente come input delle funzioni future.)

Quindi, qualsiasi consiglio su come ottenere questo set di dati in Incanter sarebbe molto apprezzato.

+0

Hai mai trovato una soluzione a questo? Ho trovato una comoda funzione di convenienza che consente di creare un buffer di byte mappato in memoria di un file come one-liner: https://github.com/pjstadig/nio (nio.core/mmap "/ path/to/file") . Sto ancora cercando di capire come leggere questo in una matrice jblas con la forma giusta però. – Peter

risposta

6

non so come convertire il vostro ByteBuffer in un array, ma qui è un'implementazione della funzione di reshape:

(defn reshape [v c] 
    (if (= (count v) 1) 
    c 
    (recur (butlast v) 
      (partition (last v) c)))) 

(Questo funziona bene nel mio test limitato.) Se i dati sono in un vettore r allora è possibile implementare

rain_data = rain_data.reshape(24, 360, 720); 

come

(reshape '(24 360 720) r) 
Problemi correlati