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
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
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. –
@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