web-dev-qa-db-fra.com

Comment sélectionner des éléments par ligne dans un tableau NumPy?

J'ai un tableau comme ce tableau 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]]

Comment ferait-on une boucle dans le tableau en sélectionnant foo et en obtenant 0,567 0,611 comme flottants comme un singleton. Sélectionnez ensuite la barre et obtenez 0,469 0,479 sous forme de flotteurs en tant que singleton .....

Je pourrais obtenir le vecteur des premiers éléments sous forme de liste en utilisant

dv=  dd[:,1]

Les éléments 'foo' et 'bar' ne sont pas des variables inconnues, ils peuvent changer.

Comment changer si l'élément est en position [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]]
12
Merlin

Vous avez mis la balise NumPy sur votre question, donc je suppose que vous voulez la syntaxe NumPy, que la réponse avant la mienne n'utilise pas.

Si en fait vous souhaitez utiliser NumPy, alors vous ne voulez probablement pas les chaînes dans votre tableau, sinon vous devrez également représenter vos flotteurs sous forme de chaînes.

Ce que vous recherchez est la syntaxe NumPy pour accéder aux éléments d'un tableau 2D par ligne (et exclure la première colonne) .

Cette syntaxe est:

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

W/r/t le deuxième scénario de votre question -- sélection de colonnes non adjacentes :

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


. puis créez une table de correspondance pour mapper les chaînes avec les indices de lignes numériques :

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

Le deuxième scénario de votre question: que faire si la colonne d'index change?

>>> # 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])
22
doug

Tout d'abord, le vecteur des premiers éléments est

dv = dd[:,0]

(python est indexé 0)

Deuxièmement, pour parcourir le tableau (et le stocker dans un dict, par exemple), vous écrivez:

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