插入包含PostgreSQL子数组的numpy数组



我有一个需要插入PostgreSQL的numpy数组。包含子数组的numpy数组已在元组中。元组看起来像这样:

((1,0.,-0.5,[0,0],1,5((。-我缩短了数组以显示子数组。

元组包含用于插入单行的单个项。如果我想插入多行,元组将包含多个项。

我已经为numpy.uint32、numpy.float32和numpy.ndarray注册了PostgreSQL适配器。:

from psycopg2.extensions import register_adapter, AsIs
def numpy2pyUInt32(self,npUInt32):
return AsIs(npUInt32.item())
def numpy2pyFloat32(self,npFloat32):
return AsIs(npFloat32.item())
def numpy2pyndarray(self,npndarray):
return AsIs(npndarray.tolist())
register_adapter(numpy.uint32, self.numpy2pyUInt32)
register_adapter(numpy.float32, self.numpy2pyFloat32)
register_adapter(numpy.ndarray, self.numpy2pyndarray)

要插入数据,我使用execute_values()和以下sql命令:CCD_ 2。但当我执行这个时,我从psycopg2得到一个错误,说:

Traceback (most recent call last):  
File "...", line 132, in <module>  
...
File "...", line 113, in ...
psycopg2.extras.execute_values (cur, sql_command, col_values)
File "/.../lib/python3.8/site-packages/psycopg2/extras.py", line 1292, in execute_values
cur.execute(b''.join(parts))
psycopg2.errors.SyntaxError: syntax error at or near "["
LINE 1: ...06346473842859,0.0,0.0,0.0,14.284889221191406,4,0,[0, 0],540...
^

附加信息:

data = ((1,0., -0.5, ..., [0, 0], 1, 5))
print(type(data)) # <class 'tuple'>
print(type(data[0])) # <class 'numpy.void'>
print(data[0].dtype) #
[('..', '<u4'), ('..', '<f4'), ('..', '<f4'), ('..', '<f4'), ('..', '<f4'),
('..', '<f4'), ('..', '<f4'), ('..', '<f4'), ('..', '<f8'), ('..', '<f4'),
('..', '<f4'), ('..', '<f4'), ('..', 'u1'), ('..', 'u1'),
('..', 'u1',(2,)), # sub-array
('..', '<u4'), ('..', '<u4'), ('..', '<u4'), ('..', '<u4'), ('..', '<u4'), 
('..', '<u4')]
print (data[0].shape) # ()
print (type(data[0][0])) # <class 'numpy.uint32'>
...
print (type(data[0][14])) # <class 'numpy.ndarray'>

定义数据类型:

In [16]: dt=np.dtype([('x','f'),('y','i',2)])

和结构化阵列:

In [17]: arr = np.zeros(3,dt)
In [18]: arr
Out[18]: 
array([(0., [0, 0]), (0., [0, 0]), (0., [0, 0])],
dtype=[('x', '<f4'), ('y', '<i4', (2,))])

查看一条记录:

In [19]: arr[0]
Out[19]: (0., [0, 0])

将其包装在元组中不会转换内部数组:

In [20]: tuple(arr[0])
Out[20]: (0.0, array([0, 0], dtype=int32))
In [21]: print(tuple(arr[0]))
(0.0, array([0, 0], dtype=int32))
In [22]: arr[0].tolist()
Out[22]: (0.0, array([0, 0], dtype=int32))

专注于这一领域:

In [23]: arr['y']
Out[23]: 
array([[0, 0],
[0, 0],
[0, 0]], dtype=int32)
In [24]: arr['y'][0]
Out[24]: array([0, 0], dtype=int32)
In [25]: arr['y'].tolist()
Out[25]: [[0, 0], [0, 0], [0, 0]]

使用字段名列表对数组进行索引,减去问题一:

In [26]: arr[['x']]
Out[26]: 
array([(0.,), (0.,), (0.,)],
dtype={'names':['x'], 'formats':['<f4'], 'offsets':[0], 'itemsize':12})
In [27]: tuple(arr[['x']][0])
Out[27]: (0.0,)
In [29]: arr[['x']].tolist()
Out[29]: [(0.0,), (0.0,), (0.0,)]

最新更新