2012-06-27 21 views
9

Czy w numpy można mieć tablicę rekordów 3D? (Może to nie jest możliwe lub po prostu jest łatwiejszy sposób robienia rzeczy - jestem otwarty na inne opcje).3d numpy tablica rekordów

Załóżmy, że chcę tablicy, która przechowuje dane dla 3 zmiennych (np. Temp, precypitacja, wilgotność), a dane każdej zmiennej są w rzeczywistości 2-d tablicą 2 lata (wiersze) i 6 miesięcy danych (kolumny), mógłbym stworzyć że tak:

>>> import numpy as np 

>>> d = np.array(np.arange(3*2*6).reshape(3,2,6)) 
>>> d 

# 
# comments added for explanation... 
#  jan feb mar apr may Jun  

array([[[ 0, 1, 2, 3, 4, 5], # yr1 temp 
     [ 6, 7, 8, 9, 10, 11]], # yr2 temp 

     [[12, 13, 14, 15, 16, 17], # yr1 precip 
     [18, 19, 20, 21, 22, 23]], # yr2 precip 

     [[24, 25, 26, 27, 28, 29], # yr1 humidity 
     [30, 31, 32, 33, 34, 35]]]) # yr2 humidity 

Chciałbym móc wpisać:

>>> d['temp'] 

i otrzymaj (pierwszy "stronę" danych):

>>> array([[ 0, 1, 2, 3, 4, 5], 
      [ 6, 7, 8, 9, 10, 11]]) 

czyli

>>> d['Jan'] # assume months are Jan-June 

i otrzymaj

>>> array([[0,6], 
      [12,18], 
      [24,30]]) 

Byłem przez to: http://www.scipy.org/RecordArrays kilka razy, ale nie widzę w jaki sposób skonfigurować co jestem po.

Odpowiedz

12

W rzeczywistości można zrobić coś podobnego z uporządkowanymi tablicami, ale generalnie jest to więcej kłopotu niż jest warte.

Potrzebne są zasadniczo osie oznaczone etykietą.

Pandas zapewnia to, czego potrzebujesz, i jest lepszym wyborem, jeśli chcesz tego typu indeksowanie. Jest też Larry (for labeled array), ale w dużej mierze został zastąpiony przez Pandy.

Należy również zapoznać się z dokumentacją numpy dla strukturowanych tablic, aby uzyskać więcej informacji niż FAQ. Dokumentacja numpy ma znacznie więcej informacji. http://docs.scipy.org/doc/numpy/user/basics.rec.html

Jeśli chcesz wziąć trasę z czystym numpy, zwróć uwagę, że uporządkowane tablice mogą zawierać wielowymiarowe tablice. (Zwróć uwagę na argument kształtu podczas określania typu dtype). To jednak szybko stanie się bardziej złożone niż jest warte.

Zgodnie z terminologią pandas, wymagana jest Panel. Najprawdopodobniej powinieneś jednak najpierw uzyskać get familiar with DataFrames.

Oto jak chcesz to zrobić z Pandas:

import numpy as np 
import pandas 

d = np.array(np.arange(3*2*6).reshape(3,2,6)) 

dat = pandas.Panel(d, items=['temp', 'precip', 'humidity'], 
         major_axis=['yr1', 'yr2'], 
         minor_axis=['jan', 'feb', 'mar', 'apr', 'may', 'jun']) 

print dat['temp'] 
print dat.major_xs('yr1') 
print dat.minor_xs('may') 
+0

hmm, ok, który częściowo potwierdza moje zmieszanie. Pandy wyglądają idealnie, dzięki! – tbc