Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将numpy数组转换为postgresql列表_Python_Arrays_Postgresql_Numpy - Fatal编程技术网

Python 如何将numpy数组转换为postgresql列表

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

我试图使用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 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副本吗?