【发布时间】:2020-10-30 08:06:24
【问题描述】:
这将是一个副本 store numpy array in mysql 。原因是那里没有回答 实际 问题,5 年后我(另一个随机的人)也在为同样的问题苦苦挣扎。
目标
我有很多 numpy 向量。我想将它们中的每一个存储在 MySQL 数据库的 BLOB 列中。 I have already read that this is likely not a good idea,但我还是想这样做。为此,我正在尝试创建一个查询。代码如下所示:
query = 'INSERT INTO vectors_table (word_id, vector) VALUES '
for i in vectors:
query += ({}, {}).format(i.index, i.vector.dumps())
(注意对.dumps()的调用)
替代品
Numpy 数组有一些函数选项可以“序列化”其数据:
-
.dumps()给了我一个bytes“字符串”; -
.tostring()也给了我一个bytes"字符串", but apparently has problems
我也可以使用泡菜。有一个名为pickle.dumps 的函数也给了我一个bytes 序列。
问题
当我尝试创建查询时,它会在字符串之前插入该死的b。例如,如果我打印我的一个向量,它看起来像:
b'\x80\x02cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02c_codecs\nencode\nq\x03X\x01\x00\x00\x00bq\x04X\x06\x00\x00\x00latin1q\x05\x86q\x06Rq\x07\x87q\x08Rq\t(K\x01M\x00\x0c\x85q\ncnumpy\ndtype\nq\x0bX\x02\x00\x00\x00f4q\x0cK\x00K\x01\x87q\rRq\x0e(K\x03X\x01\x00\ ...
不幸的是,从上面的“替代方案”中可以看出,到目前为止我发现的所有替代方案都是如此。
尝试的解决方案
在尝试解决问题时,我发现很多人告诉我使用decode,或cast the bytes into a string。
调用.decode('ascii') 或.decode('utf-8') 分别导致UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128) 和UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte。
尝试将bytes 转换为字符串会创建一个包含“b”的字符串。
有没有更好的方法?
我是 MySQL 的菜鸟,我完全相信我缺少一些明显的解决方案。我已经到了打算用
创建一个字符串的地步for i in vectors:
old_str = str(i.vector.dumps())
new_str = old_str[1:]
query += ({}, {}).format(i.index, new_str)
然后将其插入到我的查询字符串中。仍然......我不敢相信这是让它工作的唯一方法。
【问题讨论】: