2011-09-25 18 views
6

mi hanno una serie come questa matrice NumPyCome selezionare gli elementi in ordine di riga da una matrice 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]] 

Come sarebbe un ciclo attraverso serie selezionando foo e ottenere 0,567 0,611 come carri come Singleton. Quindi selezionare bar e ottenere 0,469 0,479 come carri come Singleton .....

ho potuto ottenere vettore i primi elementi come elenco utilizzando

dv= dd[:,1] 

Il 'foo', e gli elementi 'bar' non sono variabili sconosciute, possono cambiare.

Come dovrei cambiare se elemento è in posizione [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

Cosa sono "foo", "bar", ecc.? Stringhe? O solo segnaposto per altri numeri? –

+0

Come hai potuto costruire un array numpy che contiene * entrambi * float e stringhe? – talonmies

+0

@tal dal database. – Merlin

risposta

16

Hai messo il tag NumPy sulla vostra domanda, così ho' Supponiamo che tu voglia la sintassi NumPy, che la risposta prima del mio non usa.

Se in effetti si desidera utilizzare NumPy, probabilmente non si vogliono le stringhe nell'array, altrimenti sarà necessario rappresentare i float come stringhe.

Cosa che cerchi è sintassi NumPy per accedere agli elementi di una matrice 2D per riga (ed escludere la prima colonna).

Tale sintassi è:

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

W/r/t secondo scenario nel interrogo selezionano colonne non adiacenti:

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


La piccola complicazione la tua domanda è solo che vuoi usare una stringa per row_index, quindi è necessario rimuovere le stringhe (in modo da poter creare una matrice NumPy 2D di float), sostituirle con numeri indici di riga e poi creare una tabella di look-up per mappare le corde con gli indici di riga numerica:

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

Il secondo scenario nella tua domanda: che cosa se i cambiamenti delle colonne dell'indice?

>>> # 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]] non funziona, 'row_index' dove è questa funzione ? – Merlin

+0

@ Merlin: sì, funziona. 'row_index' è un segnaposto o variabile - significa semplicemente + indice di riga * che significa indice per quella riga (un valore intero intero – doug

+0

@Merlin: ti ho mostrato come creare un archivio di valori-chiave nella mia risposta. , ad esempio, con 2 liste, una per le chiavi, una per i valori. keys = ['key1', 'key2', 'key3'], vals = range (3); crea una tupla composta da entrambe le liste, quindi chiama ' zip ', quindi' dict 'su quella tupla - il risultato è un dizionario LuT = dict (zip (chiavi, vals)) – doug

2

Innanzitutto, il vettore dei primi elementi è

dv = dd[:,0] 

(pitone è 0-indicizzato)

secondo luogo, a percorrere la matrice (e conservare in un dizionario, per esempio) scrivere:

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ì è tardi .... – Merlin

Problemi correlati