Quel est l'équivalent de 'fread' de Matlab en Python?
Je n'ai pratiquement aucune connaissance de Matlab, et de la nécessité de traduire certaines des routines d'analyse en Python. Ils sont pour les gros fichiers, qui sont eux-mêmes divisés en "blocs", et je vais avoir des difficultés à droite de la route, avec la somme de contrôle en haut du fichier.
Ce qui se passe exactement ici dans Matlab?
status = fseek(fid, 0, 'cof');
fposition = ftell(fid);
disp(' ');
disp(['** Block ',num2str(iBlock),' File Position = ',int2str(fposition)]);
% ----------------- Block Start ------------------ %
[A, count] = fread(fid, 3, 'uint32');
if(count == 3)
magic_l = A(1);
magic_h = A(2);
block_length = A(3);
else
if(fposition == file_length)
disp(['** End of file OK']);
else
disp(['** Cannot read block start magic ! Note File Length = ',num2str(file_length)]);
end
ok = 0;
break;
end
fid est le fichier actuellement regardé
iBlock est un compteur pour qui "le bloc" vous êtes dans dans le fichier
magic_l et magic_h sont à faire avec les sommes de contrôle plus tard, voici le code qui (suit directement le code ci-dessus):
disp(sprintf(' Magic_L = %08X, Magic_H = %08X, Length = %i', magic_l, magic_h, block_length));
correct_magic_l = hex2dec('4D445254');
correct_magic_h = hex2dec('43494741');
if(magic_l ~= correct_magic_l | magic_h ~= correct_magic_h)
disp(['** Bad block start magic !']);
ok = 0;
return;
end
remaining_length = block_length - 3*4 - 3*4; % We read Block Header, and we expect a footer
disp(sprintf(' Remaining Block bytes = %i', remaining_length));
- Ce qui se passe avec le
%08X
et lahex2dec
des trucs? - Aussi, pourquoi spécifier
3*4
au lieu de12
?
Vraiment bien, je veux savoir comment reproduire [A, count] = fread(fid, 3, 'uint32');
en Python, comme io.readline()
est simplement de tirer les 3 premiers caractères du fichier. Toutes mes excuses si je manque le point quelque part ici. C'est juste que l'utilisation de io.readline(3)
sur le fichier semble renvoyer quelque chose qu'il ne devrait pas, et je ne comprends pas comment les block_length
peuvent tenir dans un seul octet quand il pourrait être très longue.
Merci pour la lecture de cette randonnée. J'espère que vous pouvez comprendre un peu ce que je veux savoir! (Aucune information du tout apprécié.)
source d'informationauteur Duncan Tait
Vous devez vous connecter pour publier un commentaire.
De la la documentation de
fread
c'est une fonction pour lire des données binaires. Le deuxième argument spécifie la taille du vecteur de sortie, le troisième, la taille et le type des éléments de lire.Afin de recréer ce en Python, vous pouvez utiliser le
array
module:Cela permettra de lire trois uint32 les valeurs du fichier
f
qui sont disponibles dansa
par la suite. À partir de la documentation defromfile
:Tableaux de mettre en œuvre la séquence de protocole et donc de soutenir les mêmes opérations que pour les listes, mais vous pouvez également utiliser le
.tolist()
méthode pour créer une liste normale à partir du tableau.Code Python pour la Lecture d'un 1-Dimensions de la Matrice de
Lors du remplacement de Matlab avec Python, j'ai voulu lire des données binaires dans un
numpy.array
j'ai donc utilisénumpy.fromfile
pour lire les données dans un 1-dimensions tableau:Certains avantages de l'utilisation de
numpy.fromfile
par rapport à d'autres Python solutions:count=
argument, mais il est par défaut-1
qui indique la lecture de tout fichier.Être en mesure de spécifier un fichier objet (comme je l'ai fait ci-dessus avec
fid
) ou vous pouvez spécifier un nom de fichier. Je préfère utiliser un fichier ouvert à l'objet, mais si vous souhaitez utiliser un nom de fichier, vous pouvez remplacer les deux lignes ci-dessus avec:Code Matlab pour un Tableau en 2 Dimensions
Matlab
fread
a la capacité de lire les données dans une matrice de la forme[m, n]
au lieu de simplement lire dans un vecteur colonne. Par exemple, pour lire les données dans une matrice à 2 lignes d'utilisation:Équivalent du Code Python pour un Tableau en 2 Dimensions
Vous pouvez gérer ce scénario en Python à l'aide de Numpy est
shape
ettranspose
.-1
ditnumpy.remodeler
pour en déduire la longueur de la matrice pour que la dimension de l'autre dimension—l'équivalent de Matlabinf
l'infini de la représentation..T
transpose la matrice de sorte que c'est un tableau en 2 dimensions avec la première dimension—l'axe d'une longueur de 2.La première partie est couverte par Torsten la réponse... vous allez avoir besoin d'
array
ounumarray
rien à faire avec ces données, de toute façon.Comme pour l' %08X et la hex2dec trucs, %08X est juste le format d'impression pour ceux unit32 numéros (8 chiffres hex, exactement le même que Python), et hex2dec('4D445254') est matlab pour 0x4D445254.
Enfin, ~ = (matlab est un bit à bit comparer; utiliser == en Python.