元组数数据类型

2024-04-27 06:11:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在通过以下方式从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)的元组,例如:

^{pr2}$

我想这样做是为了简化我后面的一些语句,在这些语句中,我将从数组中提取颜色作为一个元组,并且不需要为自己创建字典:

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

谢谢!在


Tags: namenumpysqlite颜色np方式数组语句
1条回答
网友
1楼 · 发布于 2024-04-27 06:11:09

你真的需要一个tuple?还是只想将值分组?你可以为每个字段创建一个任意形状的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)])

这甚至适用于n维数组:

^{pr2}$

部分应用于您的特定问题:

>>> desc = {'names':('name','Color'),'formats':('a3','3f')}
>>> colorlist = np.array([('ABC', (1, 2, 3)), ('CBA', (3, 2, 1))], desc)
>>> colorlist[colorlist['name']=='ABC']['Color'][0]
array([ 1.,  2.,  3.], dtype=float32)

使用rec.fromarrays从两个常规数组生成记录数组:

>>> 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)

相关问题 更多 >