2015-07-13 6 views
5

Ho un file HDF5 contenente array che vengono salvati con Python/numpy. Quando li leggo in Julia usando HDF5.jl, gli assi sono al contrario dell'ordine in cui appaiono in Python. Per ridurre la ginnastica mentale coinvolta nello spostamento tra le codebase di Python e Julia, inverto l'ordine degli assi quando leggo i dati in Julia. Ho scritto la mia funzione per fare questo:Lettura dei dati HDF5 con ordine dell'asse numpico con Julia HDF5

function reversedims(ary::Array) 
    permutedims(ary, [ ndims(ary):-1:1 ]) 
end 

data = HDF5.read(someh5file, somekey) |> reversedims 

Questo non è l'ideale, perché (1) devo sempre importare reversedims per utilizzare questo; (2) Devo ricordarmi di farlo per ogni Array che ho letto. Mi chiedo se è possibile utilizzare i comandi:

  • istruire HDF5.jl leggere nelle matrici con un ordine asse NumPy stile, sia attraverso un argomento chiave o un qualche tipo di parametro di configurazione globale
  • uso di un incorporata funzione argomento singolo per invertire gli assi

risposta

0

Mi sembra che permutedims! faccia ciò che si sta cercando, tuttavia esegue una copia di matrice. Se riesci a riscrivere i file hdf5 in python, le rivendicazioni numpy.asfortranarray restituiscono i tuoi dati memorizzati nel formato principale della colonna, sebbene lo numpy internals docs sembri suggerire che i dati non siano alterati, semplicemente il passo è, quindi non so se il l'output del file hdf5 sarebbe diverso

Modifica: Mi dispiace, ho appena visto che stai già utilizzando permutedims nella tua funzione. Non sono riuscito a trovare nient'altro sul lato Julia, ma proverei ancora lo numpy.asfortranarray e vedere se questo aiuta.

+0

In alternativa, è possibile invertire le falcate dell'array, che presenta gli stessi svantaggi che hai menzionato (ricordati di farlo ogni volta, ecc.), Ma evita la copia di memoria – user3288829

+0

Grazie-- non è il mio attuale soluzione implementare ciò che si propone nel tuo commento però? Non credo che 'permutedims' (versione senza'! ') Esegua una copia dell'array. E non sta cambiando i passi che cosa significa permutare le dimensioni? Forse sono confuso. –

+0

@SeanMackesey hai ragione, mi sono affrettato quando ho risposto e avrei dovuto notare la normale funzione di "permutedims". Stavo guardando [questo] (https://github.com/stevengj/PyCall.jl/pull/85) thread e ho visto che un modo per evitare la chiamata permanente è stato quello di riordinare le falcate e le dimensioni. È discutibile se questo abbia qualche beneficio per i permutibili non copiati. Questa è solo la natura delle lingue con differenti strutture interne di array, devi convertire da una parte o dall'altra. Sei riuscito a provare il 'numpy.asfortranarray'? – user3288829