Comme Cody Brocious a écrit, vous pouvez emballer votre tête entière à la fois:
header = struct.pack('<iiHH', nSamples, nSampPeriod, nSampSize, nParmKind)
Il a également l'endianness mentionné, ce qui est important si vous voulez emballer vos données afin de les décompresser de manière fiable sur des machines avec des architectures différentes. Le <
au début de ma chaîne de format spécifie "empaqueter ces données en utilisant une convention little-endian". En ce qui concerne le tableau, vous devrez en emballer la longueur afin de déterminer le nombre de valeurs à décompresser lorsque vous le relirez. Faire tout en un seul appel:
flattened = npVect.ravel() # get a 1-D array of numbers
arrSize = len(flattened)
# pack header, count of numbers, and numbers, all in one call
packed = struct.pack('<iiHHi%df' % arrSize,
nSamples, nSampPeriod, nSampSize, nParmKind, arrSize, *flattened)
Selon la taille de votre tableau est susceptible d'être, vous pourriez finir avec une chaîne énorme représentant le contenu de votre fichier binaire, et vous voudrez peut-être se pencher sur des solutions de rechange à struct
qui ne nécessite pas que vous ayez le fichier entier en mémoire.
Déballer:
fmt = '<iiHHi'
nSamples, nSampPeriod, nSampSize, nParmKind, arrSize = struct.unpack(fmt, packed)
# Use unpack_from to start reading after the packed header and count
flattened = struct.unpack_from('<%df' % arrSize, packed, struct.calcsize(fmt))
npVect = np.ndarray(flattened, dtype='float32').reshape(# your dimensions go here
)
EDIT: Oops, le format du tableau est pas tout à fait aussi simple que cela :) L'idée générale tient, cependant: aplatir votre tableau dans une liste de numéros en utilisant une méthode vous aimez, emballez le nombre de valeurs, puis emballez chaque valeur. De l'autre côté, lisez le tableau sous la forme d'une liste plate, puis appliquez la structure dont vous avez besoin.
EDIT: Modification des chaînes de format pour utiliser des spécificateurs de répétition plutôt qu'une multiplication de chaîne. Merci à John Machin de l'avoir signalé.
EDIT: Ajout du code numpy
pour aplatir la matrice avant de l'emballer et de la reconstruire après le déballage.
Notez que vous pouvez regrouper plusieurs valeurs à la fois: struct.pack ('Hi', foo, bar). En outre, vous devez placer un '>' ou un '<' avant la chaîne de format, de sorte qu'il sera empaqueté et décompacté correctement sur les systèmes avec une endianness différente. –