为了账号安全,请及时绑定邮箱和手机立即绑定

将 Numpy 数组的 float64 项作为二进制插入 PostgreSQL

将 Numpy 数组的 float64 项作为二进制插入 PostgreSQL

三国纷争 2021-10-10 16:22:00
我正在尝试将 Numpy 数组插入 PostgreSQL。试图这样做def write_to_db(some_arr, some_txt):""" insert a new array into the face_ar table """    sql = """INSERT INTO test_db VALUES(%s,%s);"""    conn = None    try:        params = config()        conn = psycopg2.connect(**params)        cur = conn.cursor()        cur.execute(sql, (some_arr, some_txt))        conn.commit()        cur.close()    except (Exception, psycopg2.DatabaseError) as e:        print(e)    finally:        if conn is not None:            conn.close()在它之前我在我的数据库中创建了一个表create table test_db (encodings double precision[], link text);最后我得到一个错误:“不能适应类型 'numpy.ndarray'”我需要编写包含 125 个 float64 项的 Numpy 数组和每行中的链接等小文本。我的项目中会有几百万行。只是读取速度和数据库大小很重要。据我所知,无法直接插入 Numpy 数组,需要将其转换为另一种格式。我得到的第一个想法是将其转换为二进制数据并将其保存到 DB,但我不知道该怎么做以及如何以 Numpy 数组格式从 DB 取回它。
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

这种方法在读取数据方面开始运行良好且快速


import psycopg2

from config import config

import msgpack

import msgpack_numpy as m


def write_to_db(encoding, link):

""" insert a new array into the test1_db table """

    sql = """INSERT INTO test1_db VALUES(%s,%s);"""

    conn = None

    dumped_data = msgpack.packb(encoding, default=m.encode)

    try:

        params = config()

        conn = psycopg2.connect(**params)

        cur = conn.cursor()

        cur.execute(sql, (dumped_data, link))

        conn.commit()

        cur.close()


    except (Exception, psycopg2.DatabaseError) as e:

        print(e)

    finally:

        if conn is not None:

            conn.close()


def read_from_db():

""" query data from the test1_db table """

    conn = None

    row = None

    try:

        params = config()

        conn = psycopg2.connect(**params)

        cur = conn.cursor()

        cur.execute("SELECT encodings, link FROM test1_db")

        print("The number of rows: ", cur.rowcount)

        row = cur.fetchone()

        cur.close()

    except (Exception, psycopg2.DatabaseError) as error:

        print(error)

    finally:

        if conn is not None:

            conn.close()

        encoding1, somelink = row

        return msgpack.unpackb(encoding1, object_hook=m.decode), somelink


查看完整回答
反对 回复 2021-10-10
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

尝试使用pickle python进行二进制序列化/反序列化


例子:


import numpy as np

from pickle import dumps, loads

data=np.array([1,2,4,5,6])

dumped_data = dumps(data)

loaded_data = loads(dumped_data)

print(dumped_data)

print(loaded_data)


查看完整回答
反对 回复 2021-10-10
  • 2 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号