2011-10-12 17 views
8

Esto me da un error:¿Cómo crear una matriz de registro numpy?

import numpy as np 
x = np.array([[1, 'O', 1]], 
      dtype=np.dtype([('step', 'int32'), 
          ('symbol', '|S1'), 
          ('index', 'int32')])) 

TypeError: expected a readable buffer object 

No sé por qué esto debería fallar?

Alternativamente, ¿cómo puedo forzar algo como esta declaración para que funcione?

x = np.array([[1, 'O', 1]]) 

continuación

x.dtype = np.dtype([('step', 'int32'),('symbol', '|S1'),('index', 'int32')]) 

o

x.view(dtype=np.dtype([('step', 'int32'),('symbol', '|S1'),('index', 'int32')])) 

tanto dame

ValueError: new type not compatible with array. 

Editar

Si trato de ingresar cada registro como una tupla, ¿pensará que el triple es un valor único, en lugar de tres campos separados? Por ejemplo:

import numpy as np 
x = np.array([(1, 'O', 1)], 
      dtype=np.dtype([('step', 'int32'), 
          ('symbol', '|S1'), 
          ('index', 'int32')])) 

parece estar bien hasta que lo haga esto:

import numpy.lib.recfunctions as rec 
rec.append_fields(x,'x',x['index']+1) 

me da

TypeError: object of type 'numpy.int32' has no len() 

presumiblemente porque es x.shape (1,) en lugar de (1,3).

Respuesta

7

Hacer cada fila una tupla, no una lista:

import numpy as np 
x = np.array([(1, 'O', 1)], 
      dtype=np.dtype([('step', 'int32'), 
          ('symbol', '|S1'), 
          ('index', 'int32')])) 

Numpy desarrollador Robert Kern explains:

As a rule, tuples are considered "scalar" records and lists are recursed upon. This rule helps numpy.array() figure out which sequences are records and which are other sequences to be recursed upon; i.e. which sequences create another dimension and which are the atomic elements.

+0

Gracias, pero entonces la forma de X es (1,) en lugar de (1,3)? – hatmatrix

+0

Eso es lo que se supone que debes obtener al definir una matriz estructurada. Puede acceder a las columnas con sintaxis como: 'x ['symbol']' – unutbu

+0

Gracias, publicaré el campo anexo como una pregunta separada. – hatmatrix

1

voy a mostrar una forma más general de creación de gama registro:

# prepare the array with different types 
recarr = np.zeros((4,), dtype=('i4,f4,a10')) 

# creating the columns 
col1 = [1, 7, 2, 3] 
col2 = [1.1, 0.5, 2, 7.45] 
col3 = ['This', 'is', 'text', '!!!'] 

# create a list of tuples from columns 
prepare = zip(col1, col2, col3) 

# assigning value so recarr 
recarr[:] = prepare 

Ahora puede asignar nombres para cada una de las columnas:

recarr.dtype.names = ('ID' , 'price', 'text') 

y más tarde obtener los valores para esta columna:

print recarr('price') 
Cuestiones relacionadas