2012-12-06 9 views
5

W poniższym kodzie buduję dane w postaci zagnieżdżonej listy. Po pętli for chciałbym umieścić ją w wielowymiarowej tablicy Numpy tak starannie, jak to tylko możliwe. Jednak gdy wykonuję konwersję tablicy na tym, wydaje się, że konwertuje ona tylko zewnętrzną listę do tablicy. Co gorsza, kiedy kontynuuję w dół, kończę z punktami danych jako kształt (100L,) ... więc tablicę list, gdzie każda lista jest moje dane (oczywiście chciałem (100,3)). Próbowałem też oszukać przy pomocy numpy.asanyarray(), ale nie mogę tego rozwiązać. Bardzo bym chciał, aby tablica 3d na mojej liście 3D była od początku dostępna. Jeśli nie, w jaki sposób mogę uzyskać tablicę list w tablicy 2d bez konieczności iteracji i konwersji wszystkich?Konwertowanie zagnieżdżonych list danych na wielowymiarowe tablice Numpy

Edytuj: Jestem również otwarty na lepszy sposób strukturyzacji danych od samego początku, jeśli ułatwia to przetwarzanie. Jednak nadchodzi port szeregowy i rozmiar nie jest znany wcześniej.

import numpy as np 
import time 

data = [] 
for _i in range(100): #build some list of lists 
    d = [np.random.rand(), np.random.rand(), np.random.rand()] 
    data.append([d,time.clock()]) 

dataArray = np.array(data) #now I have an array of lists of a list(of data) and a time 
dataPoints = dataArray[:,0] #this is the data in an array of lists 
+1

Nie masz 3d zagnieżdżonej listy, masz mieszankę list i skalarów. data to lista, która zawiera obiekty, które wyglądają tak: [[0.434,0.34,0.22], 0.2]. To obiekt mieszany, więc numpy nie wiedziałby, co z nim zrobić. – Bitwise

+0

Dotyczy to oryginalnego obiektu danych, dlatego nie byłem pewien, czy było to możliwe. Jednak obiekt dataPoints jest zbiorem list elementów pływających, które nie mogą wejść do tablicy 2d. – Matt

Odpowiedz

4

DataPoints nie jest listą 2d. Przekształć go najpierw w listę 2d, a następnie zadziała:

d=np.array(dataPoints.tolist()) 

Teraz d jest (100,3), jak chciałeś.

+0

Tak, dane są tablicą list. To działa, czy to najlepszy sposób na przejście od pętli for? Kończę konwersję do tablicy (dla możliwości krojenia), z powrotem do listy (aby uzyskać odpowiedni kształt), a następnie z powrotem do tablicy. – Matt

+0

Pomiń konwersję macierzy i cięcie. Dołącz tylko d (wyjdź time.clock(), ponieważ później go kroisz). To da ci listę list, które możesz następnie przekształcić w tablicę. Albo, jeszcze lepiej, zacznij od tablicy numpy i nie używaj list. – Bitwise

+0

Potrzebuję znacznika czasu w innych częściach kodu i nie znam rozmiaru w tym czasie/danych przesyłających dane przez port szeregowy. Ale twoje rozwiązanie jest najlepsze, jakie do tej pory znalazłem. – Matt

-1

Jeśli 2d tablicy jest to, co chcesz:

from itertools import chain 
dataArray = np.array(list(chain(*data)),shape=(100,3)) 

nie wyszło kod więc być może trzeba będzie zmienić kolejność kolumna/wiersz, aby uzyskać kształt, aby dopasować.

+0

Jeśli rozumiem to poprawnie, jest to po prostu powtarzanie i wykonywanie np.array() na każdej liście. Sądzę, że po prostu czuję, że jest jakiś lepszy sposób, jeśli się okaże, że tego nie zaakceptuję. – Matt

+0

http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.array.html Nie jestem pewien, skąd czerpiesz kształt kształtu. –