J'ai un lecteur de fichiers qui lit n em> octets à partir d'un fichier et renvoie une chaîne de caractères représentant ces données (binaires). Je veux lire n em> octets dans une gamme numpue de chiffres et exécuter une FFT dessus, mais j'ai du mal à créer une matrice d'une chaîne. Quelques lignes d'exemple seraient géniales. P>
'\ x01 \ x05 \ x03 \ xff' ... code>. Je veux que cela devienne
[1, 5, 3, 255] code>. P>
3 Réponses :
Sans savoir ce que vous avez entré, mais si c'était des entiers délimités par des virgules, vous pouvez faire quelque chose comme ceci:
myInts = map(int, myString.split(','))
>>> '\x01\x05\x03\xff' '\x01\x05\x03\xff' >>> map(ord, '\x01\x05\x03\xff') [1, 5, 3, 255] >>> numpy.array(map(ord, '\x01\x05\x03\xff')) array([ 1, 5, 3, 255])
in python 2, vous pouvez le faire directement avec une fois terminé cela, dans Python 3, le commutateur sur les chaînes UNICODE par défaut signifie que vous seriez Lisez dans les données sous forme d'opposition et utilisez la commande pour obtenir les mêmes résultats. P> P> numpy.fromstring code>:
a code> est
Array ([1, 5, 3, 255]) CODE> et vous pouvez utiliser les routines régulières Scipy / Numpy FFT. P>
fratbuffer code> à la place: p>
Y a-t-il un moyen de le faire lire deux octets à la fois au lieu d'un?
C'est soigné - je ne savais pas à propos de cette méthode dans Numpy. Je viens de le faire essayer d'obtenir un tableau ([1, 5, 3, -1], dtype = int8) code> retour à la place. Une idée de ce qui pourrait causer cela?
Pour lire deux octets à la fois au lieu d'un, vous pouvez changer l'argument DTYPE en quelque chose d'autre comme int16 code>,
uint16 code> - une fois que vous êtes entré dans des chaînes de plusieurs octets, cependant, Vous devrez peut-être avoir à byteswap la sortie afin d'obtenir correctement les octets. Il suffit de remplacer
a = np.fromstring (...) code> avec
a = np.fromstring (...). BYTESWAP () code>.
@dtlussier - Spécifiez-vous le dtype code> comme un entier non signé? -1 est 0xFF si vous avez affaire à des valeurs signées.
Oui, désolé j'avais manqué cette partie de votre solution. Merci d'avoir refusé cela.
Je reçois un avertissement de dépréciation avec cette méthode maintenant: Déprécationwarning: le mode binaire d'origine de Detring est obsolète, car elle se comporte étonnamment sur les intrants UNICODE. Utilisez Fourbuffer à la place code>
@Bill merci d'avoir souligné cela. J'ai mis à jour la réponse pour une version Python3-Safe avec BYTTRINGS et FromBuffer code>.
Exemple de la structure de données avec laquelle vous travaillez?