Python 元组Numpy数据类型

Python 元组Numpy数据类型,python,sqlite,numpy,Python,Sqlite,Numpy,我目前正在通过以下方式从sqlite数据库中读取颜色: import numpy as np, apsw connection = apsw.Connection(db_name) cursor = connection.cursor() desc = {'names':('name','R','G','B'),'formats':('a3','float','float','float')} colorlist = np.array(cursor.execute("SELECT name, R

我目前正在通过以下方式从sqlite数据库中读取颜色:

import numpy as np, apsw
connection = apsw.Connection(db_name)
cursor = connection.cursor()
desc = {'names':('name','R','G','B'),'formats':('a3','float','float','float')}
colorlist = np.array(cursor.execute("SELECT name, R, G, B FROM Colors").fetchall(),desc)
但是我希望在一个只有两列的numpy数组中读取这些数据,其中第二列是一个包含(R,G,B)的元组,例如:

desc = {'names':('name','Color'),'formats':('a3','float_tuple')}
colorlist = np.array(cursor.execute("SELECT name, R, G, B FROM Colors").fetchall(),desc)
我想这样做是为了简化我以后的一些语句,在这些语句中,我将颜色从数组中提取为元组,并消除创建字典的需要:

colorlist[colorlist['name']=='BOS']['Color'][0]

谢谢

你真的需要一个
元组吗?还是只希望对值进行分组?您可以为每个字段创建具有任意形状的numpy记录数组

>>> np.array([('ABC', (1, 2, 3)), ('CBA', (3, 2, 1))], dtype='3a, 3i')
array([('ABC', [1, 2, 3]), ('CBA', [3, 2, 1])], 
      dtype=[('f0', '|S3'), ('f1', '<i4', 3)])
使用
rec.fromArray
从两个常规数组生成记录数组:

>>> desc = {'names':('name','Color'),'formats':('a3','3f')}
>>> np.rec.fromarrays([['ABC', 'CBA'], [(1, 2, 3), (3, 2, 1)]], desc)[0][1]
array([ 1.,  2.,  3.], dtype=float32)
完整的解决方案:

color_query = cursor.execute("SELECT R, G, B FROM Colors").fetchall()
name_query = cursor.execute("SELECT name FROM Colors").fetchall()
desc = {'names':('name','Color'),'formats':('a3','3f')}
colorlist = np.rec.fromarrays([color_query, name_query], desc)
如果出于某种原因,您不能像那样拆分查询,您只需拆分查询结果,可能需要使用列表理解:

colorlist = np.rec.fromarrays([[row[0]  for row in query], 
                               [row[1:] for row in query]], desc)

cursor.execute(QUERY).fetchall()语句的sqlite结果示例如下:[('BOS',.96,.85,.80)]。如果我能找到一种方法让sqlite返回R、G和B分组,那么这是一个很好的解决方案,但我不确定这是否可行。请参阅上面的几个可能的解决方案。
color_query = cursor.execute("SELECT R, G, B FROM Colors").fetchall()
name_query = cursor.execute("SELECT name FROM Colors").fetchall()
desc = {'names':('name','Color'),'formats':('a3','3f')}
colorlist = np.rec.fromarrays([color_query, name_query], desc)
colorlist = np.rec.fromarrays([[row[0]  for row in query], 
                               [row[1:] for row in query]], desc)