Python 如何将numpy数组转换为postgresql列表
我试图使用python将numpy数组的两列作为两个数组插入到postgresql表中 postgresql表是DOS: 主键 能量整数[] dos整数[] 我有一个numpy阵列,它是由2x1D阵列组成的2d阵列:Python 如何将numpy数组转换为postgresql列表,python,arrays,postgresql,numpy,Python,Arrays,Postgresql,Numpy,我试图使用python将numpy数组的两列作为两个数组插入到postgresql表中 postgresql表是DOS: 主键 能量整数[] dos整数[] 我有一个numpy阵列,它是由2x1D阵列组成的2d阵列: finArray = np.array([energy,dos]) 我试图使用以下脚本插入数据库,但插入时不断出错。我不知道如何格式化数组,使其正确格式化为:插入dos值(1,{1,2,3}',{1,2,3}')” 脚本: import psycopg2 import argpa
finArray = np.array([energy,dos])
我试图使用以下脚本插入数据库,但插入时不断出错。我不知道如何格式化数组,使其正确格式化为:插入dos值(1,{1,2,3}',{1,2,3}')”
脚本:
import psycopg2
import argparse
import sys
import re
import numpy as np
import os
con = None
try:
con = psycopg2.connect(database='bla', user='bla')
cur = con.cursor()
cur.execute("INSERT INTO dos VALUES(1,'{%s}')", [str(finArray[0:3,0].tolist())[1:-1]])
con.commit()
except psycopg2.DatabaseError, e:
if con:
con.rollback()
print 'Error %s' % e
sys.exit(1)
finally:
if con:
con.close()
我无法理解的是,我会遇到如下错误:
“0.31691105000000003”处或附近的错误语法错误
第1行:插入dos值(1,“{”0.31691105000000003,-300.0,-19。。。
我不知道括号中的内部“”来自何处。您可能有一个字符串数组,请尝试更改命令添加
astype(float)
,如:
cur.execute("INSERT INTO dos VALUES(1,'{%s}')", [str(finArray[0:3,0].astype(float).tolist())[1:-1]])
引号出现在
numpy.ndarray.tolist()
期间,是因为您实际上有字符串。如果您不想假设数据是@Saullo Castro建议的float
类型,您还可以执行一个简单的str(finArray[0:3,0].tolist()。替换(“”,”)[1:
,以摆脱它们
但是,更恰当的是,如果您在脚本中以任何方式处理finArray
中的数据,并假定它们是数字,那么您可能应该确保首先将它们作为数字导入数组。
您可以要求数组在初始化时具有特定的数据类型,方法是指定,例如,
finArray=np.array(…,dtype=np.float)
然后向适合强制该类型的方向后退。Psycopg将使Python列表适应数组,因此您只需将numpy数组强制转换为Python列表并将其传递给execute方法
import psycopg2
import numpy as np
energy = [1, 2, 3]
dos = [1, 2, 3]
finArray = np.array([energy,dos])
insert = """
insert into dos (pk, energy) values (1, %s);
;"""
conn = psycopg2.connect("host=localhost4 port=5432 dbname=cpn")
cursor = conn.cursor()
cursor.execute(insert, (list(finArray[0:3,0]),))
conn.commit()
conn.close()
您需要将numpy数组转换为列表,例如:
import numpy as np
import psycopg2
fecha=12
tipo=1
precau=np.array([20.35,25.34,25.36978])
conn = psycopg2.connect("dbname='DataBase' user='Administrador' host='localhost' password='pass'")
cur = conn.cursor()
#make a list
vec1=[]
for k in precau:
vec1.append(k)
#make a query
query=cur.mogrify("""UPDATE prediccioncaudal SET fecha=%s, precaudal=%s WHERE idprecau=%s;""", (fecha,vec1,tipo))
#execute a query
cur.execute(query)
#save changes
conn.commit()
#close connection
cur.close()
conn.close()
太晚了,不过还是把它放出来 我今天试图在Redshift中插入一个numpy数组。在尝试了
odo
,df.to_sql()
以及其他方法之后,我终于以相当快的速度(约3k行/分钟)完成了这项工作。我不会谈论这些工具面临的问题,但这里有一些简单的方法可以工作:
cursor = conn.cursor()
args_str = b','.join(cursor.mogrify("(%s,%s,...)", x) for x in tuple(map(tuple,np_data)))
cursor.execute("insert into table (a,b,...) VALUES "+args_str.decode("utf-8"))
cursor.commit()
cursor.close()
第二行需要根据阵列的尺寸进行一些工作
您可能还需要检查以下答案:
感谢您在这方面的帮助,但我仍然遇到了类似的错误。我能找到的唯一解决方案是创建一个这样的字符串:cur.execute(str(“插入dos值(1,{%s},{%s},,%s,0)”%(str(atomNumbers)[1:-1],str(orbitalNum)[1:-1],finArray[0,0]))psycopg2中有一些警告,我应该避免使用%string插值,即使我的头上有枪,所以我不确定我是否做了坏事。[链接],似乎你有。如果你不介意的话,你能给我一份pdf副本吗?