2014-06-25 24 views
7

Veritabanı sorgusu gibi değerlerin birimlerini veren yinelenen bir numpy dizisi oluşturmak istiyorum. böylece gibiYinelenen tupllerden çok boyutlu bir numpy dizisi nasıl oluşturulur?

:

data = db.execute('SELECT col1, col2, col3, col4 FROM data') 
A = np.array(list(data)) 

öncelikle bir listeye iterable dönüştürmeden, bunu yaparken orada bir yolu hızlı bir yolu var mı?

+0

bunun işe yarayıp yaramadığından emin olun: http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromiter.html – Fabricator

+1

@Fabricator Dokümantasyon, yinelenen bir * 1d * dizi oluşturduğunu söylüyor. Bu durumda 4 sütunlu bir 2d dizisi yerine bir dizi nesne yaratacaktır. – Bakuriu

+0

'np.loadtxt', yinelenen, yani bir dosyadan bir dizi oluşturma örneğidir. Basitleştirilmiş terimlerle, bir satır okur, alt dizelerinden bir liste oluşturur ve bunu bir listeye ekler. Sonunda listelerin listesini bir diziye dönüştürür. – hpaulj

cevap

1

soruma teknik olarak değil bir cevap da, ben yapmaya çalışıyorum ne yapacağını bir yol bulmuş:

def get_cols(db, cols): 
    def get_col(col): 
     data = db.execute('SELECT '+col+' FROM data', dtype=np.float64) 
     return np.fromiter((v[0] for v in data)) 

    return np.vstack([get_col(col) for col in cols]).T 
+0

Bu daha hızlı mı? – hpaulj

1

Ben numpy deneyimli bir kullanıcı değilim, ama burada olası bir çözümdür genel soru: aksi rec_array

>>> i = iter([(1, 11), (2, 22)]) 
>>> i 
<listiterator at 0x5b2de30>     # a sample iterable of tuples 
>>> rec_array = np.fromiter(i, dtype='i4,i4') # mind the dtype 
>>> rec_array         # rec_array is a record array 
array([(1, 11), (2, 22)], 
    dtype=[('f0', '<i4'), ('f1', '<i4')]) 
>>> rec_array['f0'], rec_array[0]    # each field has a default name 
(array([1, 2]), (1, 11)) 
>>> a = rec_array.view(np.int32).reshape(-1,2) # let's create a view 
>>> a 
array([[ 1, 11], 
     [ 2, 22]]) 
>>> rec_array[0][1] = 23 
>>> a           # a is a view, not a copy! 
array([[ 1, 23], 
     [ 2, 22]]) 

Ben tüm sütunlar aynı türden olduğunu kabul, ne istediğinizi zaten.

Örneğinizle ilgili olarak, örneğinizde db'un ne olduğunu tam olarak anlayamıyorum. Bir imleç nesnesi ise, o zaman sadece fetchall yöntemini çağırabilir ve bir tupl listesi alabilirsiniz. Çoğu durumda, veritabanı kitaplığı kısmen okunan sorgu sonucunu tutmak istemez, kodunuzun her satırı işlemesini bekler, yani execute yönteminin ne zaman döndüğü, tüm veriler zaten bir listede saklanır ve neredeyse hiç yoktur cursor örneğini yineleme yerine fetchall kullanma sorunu.

İlgili konular