2011-08-12 15 views
9

semplice domanda su NumPy:NumPy, colonne denominate

mi caricano 100 valori per un vettore a. Da questo vettore, voglio creare una matrice A con 2 colonne, dove una colonna ha il nome "C1" e la seconda "C2", una ha tipo int32 e un'altra int64. Un esempio:

a = range(100) 
A = array(a).reshape(len(a)/2, 2) 
# A.dtype = ...? 

Come definire i tipi ei nomi delle colonne, quando creo matrice da a?

+0

La soluzione migliore è racchiudere l'array (in realtà 2) e un elenco di nomi in una classe contenitore e utilizzarlo. – Keith

+0

@ Keith: intendi una classe particolare (sono nuovo in numpy)? –

+0

No, intendo quello che crei. Quindi delegare le operazioni agli array dai metodi definiti nella nuova classe. Definisci anche un metodo '__str__' per stampare a mano gli array con intestazioni. – Keith

risposta

9

colonne Numpy matrici strutturate hanno chiamato:

import numpy as np 

a=range(100) 
A = np.array(zip(*[iter(a)]*2),dtype=[('C1','int32'),('C2','int64')]) 
print(A.dtype) 
# [('C1', '<i4'), ('C2', '<i8')] 

è possibile accedere alle colonne per nome come questo:

print(A['C1']) 
# [ 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 
# 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98] 

noti che usare np.array con zip provoca NumPy per costruire una matrice da una temporanea lista di tuple. Gli elenchi di tuple Python utilizzano molta più memoria rispetto agli equivalenti array NumPy. Quindi se la tua matrice è molto grande potresti non voler usare zip.

Invece, data una matrice NumPy A, si potrebbe usare ravel() per fare A 1D matrice, e quindi utilizzare view per trasformarlo in una matrice strutturata, quindi utilizzare astype per convertire le colonne al tipo desiderato:

a = range(100) 
A = array(a).reshape(len(a)/2, 2) 
A = A.ravel().view([('col1','i8'),('col2','i8'),]).astype([('col1','i4'),('col2','i8'),]) 
print(A[:5]) 
# array([(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)], 
#  dtype=[('col1', '<i4'), ('col2', '<i8')]) 

print(A.dtype) 
# dtype([('col1', '<i4'), ('col2', '<i8')]) 
+0

Hai ragione. http://docs.scipy.org/doc/numpy-1.4.x/reference/arrays.dtypes.html –

7

so che questa è una vecchia questione, ma un'opzione più recente a disposizione sarebbe quello di provare a utilizzare pandas. Il tipo DataFrame è progettato per dati strutturati come questo, in cui le colonne sono denominate e possono essere di tipi diversi.

Problemi correlati