Тип данных Tuple Numpy - PullRequest
       6

Тип данных Tuple Numpy

2 голосов
/ 22 сентября 2011

В настоящее время я читаю цвета из базы данных 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)

Но я надеялся прочитать эти данные в массиве с двумя столбцами, где второй столбец - это кортеж, содержащий (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]

Спасибо!

1 Ответ

5 голосов
/ 22 сентября 2011

Вам буквально нужна tuple?Или вы просто хотите, чтобы значения были сгруппированы?Вы можете создать массив пустых записей с произвольными формами для каждого из полей ...

>>> 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-мерных массивов:

>>> np.array([('ABC', ((1, 2, 3), (1, 2, 3))), ('CBA', ((3, 2, 1), (3, 2, 1)))],
             dtype='a3, (2, 3)i')
array([('ABC', [[1, 2, 3], [1, 2, 3]]), ('CBA', [[3, 2, 1], [3, 2, 1]])], 
      dtype=[('f0', '|S3'), ('f1', '<i4', (2, 3))])

Частично применяется к вашему конкретномузадача:

>>> 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...