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.
Nie wiesz, czy to działa: http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromiter.html – Fabricator
@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
'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