10
votes

Comment créer un tableau numpy de la chaîne?

J'ai un lecteur de fichiers qui lit n octets à partir d'un fichier et renvoie une chaîne de caractères représentant ces données (binaires). Je veux lire n 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.

edit: Je lis, je lis des données binaires brutes, et la chaîne que je reçois ressemble donc à '\ x01 \ x05 \ x03 \ xff' ... . Je veux que cela devienne [1, 5, 3, 255] .


1 commentaires

Exemple de la structure de données avec laquelle vous travaillez?


3 Réponses :


1
votes

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(','))


0 commentaires

5
votes
>>> '\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])

0 commentaires

21
votes

in python 2, vous pouvez le faire directement avec numpy.fromstring : xxx

une fois terminé cela, a est Array ([1, 5, 3, 255]) et vous pouvez utiliser les routines régulières Scipy / Numpy FFT.

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 fratbuffer à la place: xxx

pour obtenir les mêmes résultats.


7 commentaires

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) 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 , uint16 - 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 (...) avec a = np.fromstring (...). BYTESWAP () .


@dtlussier - Spécifiez-vous le dtype 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


@Bill merci d'avoir souligné cela. J'ai mis à jour la réponse pour une version Python3-Safe avec BYTTRINGS et FromBuffer .