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')])
La soluzione migliore è racchiudere l'array (in realtà 2) e un elenco di nomi in una classe contenitore e utilizzarlo. – Keith
@ Keith: intendi una classe particolare (sono nuovo in numpy)? –
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