2011-09-22 63 views
2

我目前在顏色讀從SQLite數據庫以下列方式:元組NumPy的數據類型

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) 

我想這樣做是爲了簡化一些我的以後語句其中I提取從陣列的顏色爲元組,並消除的我需要創建一個字典來爲我做這件事:

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

謝謝!

回答

5

您是否字面上需要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維數組:

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

cursor.execute(QUERY).fetchall()語句的sqlite結果示例如下所示:[('BOS',。96,.85,.80)]。如果我能找到一種方法讓sqlite返回R,G和B分組,那麼這是一個很好的解決方案,但我不確定這是否可行。 – hotshotiguana

+0

請參閱上面的幾個可能的解決方案。 – senderle

+0

這應該做的伎倆。謝謝。 – hotshotiguana