2012-06-27 18 views
9

È possibile avere un array di record 3D in numpy? (Forse questo non è possibile, o c'è semplicemente un modo più semplice di fare le cose - sono aperto ad altre opzioni).matrice di record numpy 3D

Si supponga di volere un array che contiene dati per 3 variabili (ad esempio temp, precip, umidità) e che i dati di ciascuna variabile sono in realtà una matrice 2-d di 2 anni (righe) e 6 mesi di dati (colonne), potrei creare che in questo modo:

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

mi piacerebbe essere in grado di digitare:

>>> d['temp'] 

e ottenere questo (la prima "pagina" dei dati):

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

o:

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

e ottenere questo

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

Sono stato con questo: http://www.scipy.org/RecordArrays un certo numero di volte, ma non vedo come ha installato quello che sono dopo.

risposta

12

In realtà, si può fare qualcosa di simile a questo con gli array strutturati, ma in genere è più un problema che non ne vale la pena.

Quello che vuoi sono fondamentalmente gli assi etichettati.

Pandas (che si basa su numpy) fornisce ciò che si desidera ed è una scelta migliore se si desidera questo tipo di indicizzazione. C'è anche Larry (for labeled array), ma in gran parte è stato sostituito da Panda.

Inoltre, si dovrebbe guardare la documentazione numpy per array strutturati per informazioni su questo, piuttosto che una FAQ. La documentazione numpy ha molte più informazioni. http://docs.scipy.org/doc/numpy/user/basics.rec.html

Se si desidera eseguire un instradamento puro-numerico, tenere presente che gli array strutturati possono contenere array multidimensionali. (Notare l'argomento shape quando si specifica un dtype.) Questo diventerà rapidamente più complesso di quanto valga, comunque.

Nella terminologia pandas, quello che si desidera è un Panel. Probabilmente dovresti prima il get familiar with DataFrames, però.

Ecco come si farebbe con Panda:

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, che convalida in parte la mia confusione. Panda sembra ideale, grazie! – tbc