2010-08-11 9 views
3

Nous avons un ensemble de recarrays de données pour des jours individuels - le premier attribut est un horodatage et le reste sont des valeurs.Conversion (en partie) d'un recarray numpy en un tableau 2d?

Plusieurs d'entre eux:

ts    a b c 
2010-08-06 08:00, 1.2, 3.4, 5.6 
2010-08-06 08:05, 1.2, 3.4, 5.6 
2010-08-06 08:10, 1.2, 3.4, 5.6 
2010-08-06 08:15, 2.2, 3.3, 5.6 
2010-08-06 08:20, 1.2, 3.4, 5.6 

Nous aimerions produire un tableau des moyennes de chacune des valeurs (comme si vous avez posé toutes les données de jour au-dessus de l'autre, et en moyenne tous des valeurs qui s'alignent). Les temps d'horodatage durant tout le match, donc nous pouvons le faire en créant un résultat recarray avec les horodateurs et les autres colonnes toutes 0s, puis en faisant quelque chose comme:

for day in day_data: 
    result.a += day.a 
    result.b += day.b 
    result.c += day.c 

result.a /= len(day_data) 
result.b /= len(day_data) 
result.c /= len(day_data) 

Il semble comme une meilleure façon serait de convertir chaque jour vers un tableau 2d avec juste les chiffres (en supprimant les horodatages), puis faites la moyenne de tous les éléments en une seule opération, mais nous ne pouvons pas trouver un moyen de le faire - c'est toujours un tableau 1d d'objets.

Est-ce que quelqu'un sait comment faire cela?

Répondre

8

Il y a plusieurs façons de le faire. Une façon est de sélectionner plusieurs colonnes du recarray et les jeter comme des flotteurs, puis remodeler de nouveau dans un tableau 2D:

new_data = data[['a','b','c']].astype(np.float).reshape((data.size, 3)) 

Sinon, vous pourriez envisager quelque chose comme ça (négligeablement plus lent, mais plus lisible):

Notez également qu'il peut être judicieux de rechercher dans pandas des opérations de ce type afin de pouvoir travailler facilement avec des données hétérogènes.

+2

C'est génial, merci! J'ai toujours du mal à m'habituer à faire des choses sur les tableaux dans son ensemble - mon instinct est de faire des choses aux éléments individuellement. Une note de mon test - tandis que la partie .view (np.float) ne fait pas de copie, le découpage de fantaisie le fait. – babbageclunk

+1

@Joe: Si je ne me trompe pas, @wilberforce a raison sur la copie: 'data [['a', 'b', 'c']]. Base' est None, ce qui signifie qu'il possède ses données et ne l'hérite pas de 'data'. Cela a du sens, car les champs ne sont généralement pas contigus. Si vous confirmez cela, il serait bon de mettre à jour votre réponse. :) – EOL

+0

@EOL - Vous avez absolument raison! (Je ne sais pas ce que je pensais à l'époque ...) –

Questions connexes