将Python缓冲区转换为NumPy数组-ValueError:缓冲区大小必须是元素大小的倍数

将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

我试图从Python中的MySQL数据库中读取BLOB对象。BLOB对象是一个NumPy数组

要将数组转换为缓冲区类型以插入数据库,我使用以下函数:

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
也会出现同样的错误。不过我注意到了一些有趣的问题,请查看编辑。