2014-06-25 14 views
7

Chciałbym utworzyć tablicę numpy z iteracji, która daje krotki wartości, takie jak zapytanie do bazy danych.Jak utworzyć wielowymiarową tablicę numpy z iteracji krotek?

tak:

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

Czy istnieje sposób szybszy sposób robić to, bez jego przetwarzania iterable do pierwszego na liście?

+0

Nie wiesz, czy to działa: http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromiter.html – Fabricator

+1

@Fabricator Dokumentacja mówi, że tworzy tablicę * 1d * z iteracji. W takim przypadku tworzyłaby tablicę obiektów zamiast tablicy 2d z 4 kolumnami. – Bakuriu

+0

'np.loadtxt' jest przykładem tworzenia tablicy z pliku iterowalnego, a mianowicie pliku. W uproszczeniu odczytuje linię, tworzy listę z jej podłańcuchów i dołącza ją do listy. Na końcu konwertuje listę list do tablicy. – hpaulj

Odpowiedz

1

chociaż technicznie nie jest odpowiedź na moje pytanie, znalazłem sposób na to, co staram się robić:

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

Czy to jest szybsze? – hpaulj

1

nie jestem doświadczonym użytkownikiem numpy, ale tutaj jest możliwe rozwiązanie dla ogólne pytanie:

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

Zakładam, że wszystkie kolumny są tego samego typu, w przeciwnym razie rec_array jest już to, co chcesz.

Jeśli chodzi o konkretny przypadek, nie do końca rozumiem, co to jest db w twoim przykładzie. Jeśli jest to obiekt kursora, możesz po prostu wywołać jego metodę fetchall i uzyskać listę krotek. W większości przypadków biblioteka baz danych nie chce zachować częściowo odczytanego wyniku zapytania, czekając na kod przetwarzający każdą linię, to jest w momencie, gdy zwracana jest metoda execute, wszystkie dane są już zapisane na liście i nie ma prawie wcale problem z używaniem fetchall zamiast iterowania instancji.

Powiązane problemy