2016-08-05 79 views
0

我有上面列出的错误,但一直无法找到它的含义。我是numpy和它的{.frombuffer()}命令的新手。其中该错误触发的代码是:numpy.frombuffer ValueError:缓冲区小于请求的大小

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是 '>',其中条件== 0和 '<',其中条件!= 0。这正在改变二进制文件的读取方式,大端或小端。 fid是一个已经打开的二进制文件。

调试到这一点,条件= 1,所以我有一种感觉,如果条件的最后一个语句也有错误,我现在只是看不到它。

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

+0

你可以发布更多的代码吗?如果我们知道二进制文件如何存储到'fid',以及设置了“ARRAY_1”,那么我认为这会有所帮助。 – Frangipanes

+0

@Frangipanes我按照你的要求添加了更多的代码,但我不确定它会有多大的帮助。 – SanticL

+0

您是否也可以包含您的进口产品,以便我们也了解您使用的模块? – Frangipanes

回答

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

读一个简单的字节串(在PY 3):

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读的一半计数阅读。

+0

我明白了,所以我问的太多了?当我使用'h'时,我需要缩小一半所需的尺寸。 我可以使用-1吗?或者这会让它不够优化? – SanticL