2011-10-12 29 views
8

Questo mi dà un errore:Come creare una matrice di record 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 

Non so perché questo dovrebbe fallire?

In alternativa, come posso far funzionare qualcosa come questa istruzione?

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

poi

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

o

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

entrambi mi danno

ValueError: new type not compatible with array. 

Modifica

Se tento di inserire ogni record come una tupla, penserà che la tripla sia un singolo valore, piuttosto che tre campi separati? Per esempio:

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

sembra bene fino a quando faccio questo:

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

mi dà

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

presumibilmente perché x.shape è (1,) invece di (1,3).

risposta

7

Fare ogni riga una tupla, non una lista:

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

Numpy sviluppatore 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

Grazie, ma poi la forma di X è (1,) anziché (1,3)? – hatmatrix

+0

Ecco cosa si dovrebbe ottenere quando si definisce una matrice strutturata. Puoi accedere alle colonne con la sintassi come: 'x ['symbol']' – unutbu

+0

Grazie posterò il campo di aggiunta come una domanda separata. – hatmatrix

1

mi mostrerà un modo più generale di creazione di record di matrice:

# 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 

Ora è possibile assegnare nomi per ciascuna colonna:

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

e successivamente ottenere i valori di questa colonna:

print recarr('price')