将Python缓冲区转换为NumPy数组-ValueError:缓冲区大小必须是元素大小的倍数
我试图从Python中的MySQL数据库中读取BLOB对象。BLOB对象是一个NumPy数组 要将数组转换为缓冲区类型以插入数据库,我使用以下函数:将Python缓冲区转换为NumPy数组-ValueError:缓冲区大小必须是元素大小的倍数,python,mysql,numpy,Python,Mysql,Numpy,我试图从Python中的MySQL数据库中读取BLOB对象。BLOB对象是一个NumPy数组 要将数组转换为缓冲区类型以插入数据库,我使用以下函数: numpy.getbuffer(arr) 读回后,我可以通过以下方式重新创建缓冲区对象: bytes(memoryview(arr)) 在这一点上,一切都正常工作。当在缓冲区对象上使用以下函数试图将其转换回NumPy数组时,会出现我的问题: numpy.frombuffer(arr,dtype=numpy.float64) 错误如下: ValueE
numpy.getbuffer(arr)
读回后,我可以通过以下方式重新创建缓冲区对象:
bytes(memoryview(arr))
在这一点上,一切都正常工作。当在缓冲区对象上使用以下函数试图将其转换回NumPy数组时,会出现我的问题:
numpy.frombuffer(arr,dtype=numpy.float64)
错误如下:
ValueError:缓冲区大小必须是元素大小的倍数
请注意,数据类型设置正确,我的Python版本是2.7.13,NumPy是1.13.3
编辑:在进一步挖掘之后,这里有一些额外的信息和我偶然发现的一个特点:
numpy.getbuffer(arr)
对象的长度是7392。如果我打印MySQL数据库返回值的长度(例如,使用cursor.fetchall()或fetchone()返回),则长度为7668
因此,我打印了每个对象的前30个字符,虽然它们显然是相同的东西,但从DB返回的对象有许多附加字符:
在DB之前:
?=G???B?i?j?w?LG???ࢩ?a
DB之后:
“?=G???B?i?\0j?w?LG???ࢩ?代码>
我假设问题源于数据在数据库中的存储方式。我的推理是以下代码不会产生错误:
numpy.frombuffer(numpy.getbuffer(arr),dtype=numpy.float64)
谢谢,
Adam那么你能检查这个缓冲区的大小吗?len(arr)
或者字节的长度
版本?有趣的是…创建缓冲区对象时(在写入数据库之前)的长度是7392。字节的长度(memoryview(bufferobject))只有23…您是否能够将缓冲区转换回numpy而不传递数据类型:numpy.frombuffer(arr)?还可以尝试使用特定的数据类型numpy.getbuffer(arr,dtype=numpy.float64)将numpy转换回缓冲区,并使用numpy.frombuffer(arr,dtype=numpy.float64)将其还原您不能使用frombuffer
函数指定dtype
,使用getbuffer
而不使用dtype
也会出现同样的错误。不过我注意到了一些有趣的问题,请查看编辑。