numpy: lecture efficacement un large éventail
J'ai un fichier binaire qui contient un dense n*m
matrice de 32 bits flottant. Quel est le moyen le plus efficace de le lire en Fortran-commandé numpy
tableau?
Le fichier est de plusieurs giga-octets de taille. J'arrive à contrôler le format, mais il doit être compact (c'est à dire sur 4*n*m
octets de longueur) et doit être facile à produire de la non-code Python.
modifier: Il est impératif que la méthode produit une Fortran-commandé matrice directement (en raison de la taille des données, je ne peux pas se permettre de créer un C-commandé de la matrice, puis de le transformer en un distinct Fortran-copie ordonnée.)
Ne scipy.org/Cookbook/InputOutput répondre à votre question? (Voir la section "fichiers binaires")
Merci. En fait, j'ai déjà fait des expériences avec certaines des méthodes qui y sont décrits. Je me suis poser la question dans l'espoir que quelqu'un allait venir de l'avant qui a une expérience de première main ce que je suis en train de faire, ou est familier avec
En général, j'ai trouvé lors de la lecture de tableaux de très grande taille dans numpy que j'ai besoin de connaître la taille à l'avance, afin de pré-allouer l'ensemble approprié pour contenir les données. Connaissez-vous la taille à l'avance? Si non, essayez d'utiliser une approche de deux passes: la première analyse pour découvrir taille/dimensions données, puis allouer tableau, puis de lire/analyser dans ce tableau.
Bon point, merci. Je sais que la taille à l'avance (je contrôle le format des données, afin que je puisse écrire de la taille comme une partie de l'en-tête du fichier.)
Merci. En fait, j'ai déjà fait des expériences avec certaines des méthodes qui y sont décrits. Je me suis poser la question dans l'espoir que quelqu'un allait venir de l'avant qui a une expérience de première main ce que je suis en train de faire, ou est familier avec
numpy
internes et peuvent vous conseiller à partir de cet angle.En général, j'ai trouvé lors de la lecture de tableaux de très grande taille dans numpy que j'ai besoin de connaître la taille à l'avance, afin de pré-allouer l'ensemble approprié pour contenir les données. Connaissez-vous la taille à l'avance? Si non, essayez d'utiliser une approche de deux passes: la première analyse pour découvrir taille/dimensions données, puis allouer tableau, puis de lire/analyser dans ce tableau.
Bon point, merci. Je sais que la taille à l'avance (je contrôle le format des données, afin que je puisse écrire de la taille comme une partie de l'en-tête du fichier.)
OriginalL'auteur NPE | 2010-12-06
Vous devez vous connecter pour publier un commentaire.
NumPy fournit
fromfile()
pour lire des données binaires.va créer un tableau à une dimension contenant vos données. Pour y accéder en deux dimensions Fortran-commandé
n x m
de la matrice, vous pouvez en modifier la forme:[EDIT: Le
reshape()
copie les données dans ce cas (voir les commentaires). De le faire sans cpoying, utilisezMerci à Joe Kingtion de souligner ce point.]
Mais pour être honnête, si votre matrice a plusieurs gigaoctets, je pencherais pour un HDF5 outil comme h5py ou PyTables. Les deux outils ont la FAQ en comparant l'outil à l'autre. Je préfère généralement h5py, si PyTables semble être la plus couramment utilisée (et les étendues des deux projets sont légèrement différents).
HDF5 les fichiers peuvent être écrits de la plupart des langage de programmation utilisé dans l'analyse des données. La liste des interfaces dans les liens article de Wikipédia n'est pas complet, par exemple il y a un R de l'interface. Mais je n'en connais pas la langue que vous souhaitez utiliser pour écrire les données...
n*m
tableau pour stocker un grand dense de la matrice de chars?pour n'en nommer que quelques-uns: la capacité de manière transparente, après avoir seulement une partie de la matrice en mémoire à un moment donné, la capacité de la transparence de la compression et de méta-données en prenant soin de la matrice de dimensions, éliminant ainsi une source importante d'erreurs. Et depuis qu'il est vraiment facile à utiliser, je ne vois pas de réels inconvénients.
Pourriez-vous également préciser quelque chose dans votre exemple. Si je ne
a = numpy.fromfile("filename", dtype=numpy.float32)
suivie para = a.reshape((n, m), order="FORTRAN")
sur un fichier de 4 go, ce qui peut créer une 4 GO "C" de la matrice en mémoire pour aussitôt faire un autre de 4 go en mémoire exemplaire à retourner dans le format Fortran?Rehshaping ne pas copier le tableau, elle retourne un nouveau point de vue. Il n'y a pas de dédoublement de la mémoire dans ce cas.
Je suis en supposant que vous êtes en train de lire dans une Fortran tableau ordonné à partir du disque. Vous obtenez un tableau plat qui est en fait un ixj Fortran tableau ordonné. C'est la même chose qu'un jxi C-tableau ordonné, sauf que c'est transposée. Donc, nous fasses comme jxi, puis de transposer à être ixj. Numpy pense qu'il est C-commandé jxi être considéré comme ixj, mais c'est équivalent à être directement stocké comme Fortran commandé ixj dans la mémoire.
OriginalL'auteur Sven Marnach
Fondamentalement Numpy stocke les tableaux en tant que plat de vecteurs. Les différentes dimensions sont juste une illusion créée par les différents points de vue et des avancées de la Numpy itérateur utilise.
Pour un complet et facile à suivre explication comment Numpy interne fonctionne, voir l'excellent chapitre 19 sur Le très Beau livre de codes.
Au moins Numpy
array()
etreshape()
avoir un argument pour C ("C"), Fortran ('F') ou de préserver l'ordre ('A').Voir aussi la question Comment faire pour forcer le tableau numpy pour fortran style?
Un exemple avec la valeur par défaut C indexation (ligne ordre majeur):
D'indexation à l'aide de Fortran commande (la colonne principale ordre):
L'autre point de vue,
Aussi, vous pouvez toujours obtenir de l'autre type de vue à l'aide du paramètre T d'un tableau:
Vous pouvez également régler manuellement la foulée:
OriginalL'auteur peterhil