2016-08-05 32 views
0

Ich habe den Fehler oben aufgeführt, aber konnte nicht finden, was es bedeutet. Ich bin neu zu numpy und seinem {.frombuffer()} Befehl. Der Code, in dem dieser Fehler auslöst ist:numpy.frombuffer ValueError: Puffer ist kleiner als die angeforderte Größe

ARRAY_1=400000004 
fid=open(fn,'rb') 
fid.seek(w+x+y+z) #w+x+y+z= 
if(condition==0): 
    b=fid.read(struct.calcsize(fmt+str(ARRAY_1)+'b')) 
    myClass.y = numpy.frombuffer(b,'b',struct.calcsize(fmt+str(ARRAY_1)+'b')) 
else: 
    b=fid.read(struct.calcsize(fmt+str(ARRAY_1)+'h')) 
    myClass.y = numpy.frombuffer(b,'h',struct.calcsize(fmt+str(ARRAY_1)+'h')) #error this line 

wo fmt ist '>', wo Bedingung == 0 und '<' where Bedingung = 0!. Dies ändert die Art und Weise, wie die binäre Datei gelesen wird, Big Endian oder Little Endian. fid ist eine Binärdatei, die bereits geöffnet wurde.

Debugging bis zu diesem Punkt, Bedingung = 1, so habe ich das Gefühl, dass es auch einen Fehler in der letzten Anweisung der if-Bedingung, ich sehe es gerade jetzt nicht.

Wie ich schon sagte, habe ich versucht zu finden, was der Fehler bedeutet, aber hatte kein Glück. Wenn jemand weiß, warum es auf mich ausgeht, würde ich die Hilfe wirklich mögen.

+0

Können Sie bitte mehr von Ihrem Code posten? Ich denke, es würde helfen, wenn wir wüssten, wie die Binärdatei in 'fid' gespeichert wurde und wo' ARRAY_1' gesetzt ist. – Frangipanes

+0

@Frangipanes Ich habe mehr von dem Code hinzugefügt, wie Sie gefragt haben, aber ich bin mir nicht sicher, wie hilfreich das sein wird. – SanticL

+0

Können Sie Ihre Importe auch einbeziehen, damit wir auch die Module kennen, die Sie verwenden? – Frangipanes

Antwort

0

calcsize gibt die Anzahl der Bytes an, die der Puffer dem Format gegeben hat.

In [421]: struct.calcsize('>100h') 
Out[421]: 200 
In [422]: struct.calcsize('>100b') 
Out[422]: 100 

h dauert 2 Bytes pro Stück, so für 100 Elemente, es gibt 200 Byte.

Für frombuffer, das dritte Argument ist

count : int, optional 
Number of items to read. ``-1`` means all data in the buffer. 

Also sollte ich es 100 geben, nicht 200.

ein einfaches bytestring Lesen (in PY3):

In [429]: np.frombuffer(b'one two three ','b',14) 
Out[429]: array([111, 110, 101, 32, 116, 119, 111, 32, 116, 104, 114, 101, 101, 32], dtype=int8) 

In [430]: np.frombuffer(b'one two three ','h',14) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-430-30077e924a4c> in <module>() 
----> 1 np.frombuffer(b'one two three ','h',14) 

ValueError: buffer is smaller than requested size 

In [431]: np.frombuffer(b'one two three ','h',7) 
Out[431]: array([28271, 8293, 30580, 8303, 26740, 25970, 8293], dtype=int16) 

es zu lesen, mit h Ich brauche es die Hälfte der Zählung des b Lese zu geben.

+0

Ich sehe, also habe ich zu viel verlangt? Ich muss die Hälfte verkleinern, wenn ich 'h' benutze. Könnte ich auch -1 verwenden? Oder wäre das weniger optimiert? – SanticL