2011-08-12 8 views
9

Simple pregunta sobre numpy:numpy, columnas llamadas

me cargan 100 valores a un vector a. Desde este vector, quiero crear una matriz A con 2 columnas, donde una columna tiene el nombre "C1" y la segunda "C2", una tiene el tipo int32 y otra int64. Un ejemplo:

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

Cómo definir los tipos y los nombres de las columnas, cuando creo matriz a partir de a?

+0

Su mejor opción es envolver la matriz (en realidad 2) y una lista de nombres en una clase contenedor y usar eso. – Keith

+0

@Keith: ¿te refieres a alguna clase en particular (soy nuevo en numpy)? –

+0

No, me refiero a uno que crees. Luego delega las operaciones a sus matrices de los métodos que defina en su nueva clase. Defina también un método '__str__' para imprimir sus matrices con encabezados. – Keith

Respuesta

9

columnas Numpy matrices estructuradas han nombrado:

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')] 

puede acceder a las columnas por nombre así:

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] 

Tenga en cuenta que el uso de np.array con zip causa NumPy para construir una matriz de un temporal lista de tuplas Las listas de tuplas de Python usan mucha más memoria que las matrices equivalentes de NumPy. Entonces, si su matriz es muy grande, es posible que no desee utilizar zip.

En cambio, dada una matriz NumPy A, se podría utilizar ravel() hacer A una 1D matriz, y luego usar view para convertirlo en una matriz estructurada, y luego usar astype para convertir las columnas al tipo deseado:

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

Tienes razón. http://docs.scipy.org/doc/numpy-1.4.x/reference/arrays.dtypes.html –

7

sé que esto es una cuestión de edad, sino una opción más recientemente disponible sería intentar usar pandas. El tipo DataFrame está diseñado para datos estructurados como este, donde las columnas son nombradas y pueden ser de diferentes tipos.