numpy.frombuffer ValueError:buffer小于请求的大小

时间:2016-08-05 13:44:36

标签: python numpy buffer

我有上面列出的错误,但一直无法找到它的含义。我是numpy及其{.frombuffer()}命令的新手。触发此错误的代码是:

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

其中fmt是'>'其中condition == 0和'<'条件!= 0。这改变了二进制文件的读取方式,大端或小端。 fid是一个已经打开的二进制文件。

到目前为止调试,condition = 1,所以我觉得if条件的最后一个语句也有错误,我现在看不到它。

正如我之前所说,我试图找出错误的含义,但没有运气。如果有人知道为什么它对我有误,我真的很喜欢这个帮助。

1 个答案:

答案 0 :(得分:0)

calcsize给出缓冲区给出格式的字节数。

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

h每个项目占用2个字节,因此对于100个项目,它会产生200个字节。

对于frombuffer,第三个参数是

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

所以我应该给它100,而不是200

读取一个简单的字节串(在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)

要使用h阅读,我需要将b读数的一半计算在内。