2011-09-25 19 views
6

que tienen una serie como esta matriz numpy¿Cómo seleccionar los elementos por filas desde una matriz NumPy?

dd= [[foo 0.567 0.611] 
    [bar 0.469 0.479] 
    [noo 0.220 0.269] 
    [tar 0.480 0.508] 
    [boo 0.324 0.324]] 

¿Cómo sería un bucle a través de la selección de gama foo y conseguir 0,567 0,611 como flotadores como un conjunto unitario. A continuación, seleccione bar y conseguir 0,469 0,479 como flotadores como un conjunto unitario .....

que podría conseguir vector de los primeros elementos como lista utilizando

dv= dd[:,1] 

El 'foo', y los elementos 'bar' no son variables desconocidas, pueden cambiar.

¿Cómo cambiaría si el elemento está en la posición [1]?

[[0.567 foo2 0.611] 
    [0.469 bar2 0.479] 
    [0.220 noo2 0.269] 
    [0.480 tar2 0.508] 
    [0.324 boo2 0.324]] 
+0

¿Qué son "foo", "bar", etc.? ¿Instrumentos de cuerda? ¿O solo marcadores de posición para otros números? –

+0

¿Cómo podría haber construido una matriz numpy que contenga * both * floats y strings? – talonmies

+0

@tal de la base de datos. – Merlin

Respuesta

16

de haber introducido la etiquetaNumPy en su pregunta, por lo que i' Supongo que quieres la sintaxis NumPy, que la respuesta antes que la mía no usa.

Si, de hecho, desea utilizar NumPy, es probable que no desee las cadenas en su matriz, de lo contrario también tendrá que representar sus flotadores como cadenas.

Lo que se busca es la sintaxis NumPy acceder a los elementos de una matriz 2D por fila (y excluir a la primera columna).

que la sintaxis es:

M[row_index,1:]  # selects all but 1st col from row given by 'row_index' 

W/r/t el segundo escenario en su pregunta-- selección de columnas no adyacentes:

M[row_index,[0,2]]  # selects 1st & 3rd cols from row given by 'row_index' 


La pequeña complicación en su pregunta es solo que desea usar una cadena para row_index, por lo que es necesario eliminar las cadenas (para que pueda crear una matriz 2D NumPy de flotantes), reemplácelas por numéricas índices de fila y luego crear una tabla de consulta para mapear las de las cuerdas con los índices de fila numéricos:

>>> import numpy as NP 
>>> # create a look-up table so you can remove the strings from your python nested list, 
>>> # which will allow you to represent your data as a 2D NumPy array with dtype=float 
>>> keys 
     ['foo', 'bar', 'noo', 'tar', 'boo'] 
>>> values # 1D index array comprised of one float value for each unique string in 'keys' 
     array([0., 1., 2., 3., 4.]) 
>>> LuT = dict(zip(keys, values)) 

>>> # add an index to data by inserting 'values' array as first column of the data matrix 
>>> A = NP.hstack((vals, A)) 
>>> A 
     NP.array([ [ 0., .567, .611], 
        [ 1., .469, .479], 
        [ 2., .22, .269], 
        [ 3., .48, .508], 
        [ 4., .324, .324] ]) 

>>> # so now to look up an item, by 'key': 
>>> # write a small function to perform the look-ups: 
>>> def select_row(key): 
     return A[LuT[key],1:] 

>>> select_row('foo') 
     array([ 0.567, 0.611]) 

>>> select_row('noo') 
     array([ 0.22 , 0.269]) 

El segundo escenario en su pregunta: ¿y si los cambios de columna de índice?

>>> # e.g., move index to column 1 (as in your Q) 
>>> A = NP.roll(A, 1, axis=1) 
>>> A 
     array([[ 0.611, 1. , 0.567], 
      [ 0.479, 2. , 0.469], 
      [ 0.269, 3. , 0.22 ], 
      [ 0.508, 4. , 0.48 ], 
      [ 0.324, 5. , 0.324]]) 

>>> # the original function is changed slightly, to select non-adjacent columns: 
>>> def select_row2(key): 
     return A[LuT[key],[0,2]] 

>>> select_row2('foo') 
     array([ 0.611, 0.567]) 
+0

M [row_index, [0,2]] doesnt work, 'row_index' donde está esta función ? – Merlin

+0

@Merlin: sí, funciona. 'row_index' es un marcador de posición o variable, solo significa + fila índice * que significa índice para esa fila (algún valor entero. – doug

+0

@Merlin: le mostré cómo crear un almacén de clave-valor en mi Answer. Again, start , por ejemplo, con 2 listas, una para claves, una para valores. keys = ['key1', 'key2', 'key3'], vals = range (3); crea una tupla compuesta por ambas listas, luego invoca ' zip ', luego' dict 'en esa tupla - el resultado es un diccionario. LuT = dict (zip (keys, vals)) – doug

2

En primer lugar, el vector de primeros elementos es

dv = dd[:,0] 

(Python es indexada 0)

segundo lugar, para recorrer la matriz (y guardar en un diccionario, por ejemplo) escribir:

dc = {} 
ind = 0 # this corresponds to the column with the names 
for row in dd: 
    dc[row[ind]] = row[1:] 
+0

"dv = dd [:, 0]", sí lo es ... – Merlin

Cuestiones relacionadas