OVH Cloud OVH Cloud

Selectionner la premier colonne

10 réponses
Avatar
Christophe
Bonjour,

Je butte sur un problème très simple et je ne trouve pas de solution
élégante.

Soit la matrice A par exemple de dimension 2 :
A = [[1,2],[3,4]]

donc A =
1 2
3 4

Je souhaiterais sélectioner la première colonne, donc [1,3] et la seule
méthode que j'ai trouvée est la suivante :
[A[i][0] for i in range(len(A))]

Autant dire que ce n'est pas très lisible !

Quelqu'un aurait-il une méthode plus 'pythonique' ?

Merci,

10 réponses

Avatar
Jerome
Christophe wrote:
Bonjour,

Je butte sur un problème très simple et je ne trouve pas de solution
élégante.

Soit la matrice A par exemple de dimension 2 :
A = [[1,2],[3,4]]

donc A > 1 2
3 4

Je souhaiterais sélectioner la première colonne, donc [1,3] et la seule
méthode que j'ai trouvée est la suivante :
[A[i][0] for i in range(len(A))]

Autant dire que ce n'est pas très lisible !

Quelqu'un aurait-il une méthode plus 'pythonique' ?

Merci,



Bonjour,

une autre solution :

import numarray

a = numarray.array([[1,2],[3,4]])
print numarray.transpose(a)[0]

Après, de là à dire que c'est plus simple ou plus efficace je ne saurais
pas dire. En tout cas c'est plus mathématique ;-)

Avatar
SL
bonjour,

map(lambda x : x[0], A)

ou encore

map(lambda x : x[:1], A)


c'est assez pythonique ? ... en tout cas c'est fonctionnel ;)



Christophe wrote:
Bonjour,

Je butte sur un problème très simple et je ne trouve pas de solution
élégante.

Soit la matrice A par exemple de dimension 2 :
A = [[1,2],[3,4]]

donc A > 1 2
3 4

Je souhaiterais sélectioner la première colonne, donc [1,3] et la seule
méthode que j'ai trouvée est la suivante :
[A[i][0] for i in range(len(A))]

Autant dire que ce n'est pas très lisible !

Quelqu'un aurait-il une méthode plus 'pythonique' ?

Merci,


Avatar
Christophe
On Thu, 10 Mar 2005 19:07:59 +0100, Jerome

Bonjour,

Je butte sur un problème très simple et je ne trouve pas de solution
élégante.

Soit la matrice A par exemple de dimension 2 :
A = [[1,2],[3,4]]

donc A > > 1 2
3 4

Je souhaiterais sélectioner la première colonne, donc [1,3] et la
seule méthode que j'ai trouvée est la suivante :
[A[i][0] for i in range(len(A))]

Autant dire que ce n'est pas très lisible !

Quelqu'un aurait-il une méthode plus 'pythonique' ?

Merci,



Bonjour,

une autre solution :

import numarray

a = numarray.array([[1,2],[3,4]])
print numarray.transpose(a)[0]

Après, de là à dire que c'est plus simple ou plus efficace je ne
saurais pas dire. En tout cas c'est plus mathématique ;-)


Oui il y a aussi l'instruction 'take' avec numarray qui permet de
sélectionner ce que l'on veut mais l'inconvénient de numarray c'est
qu'il ne fonctionne que avec des nombres !

Merci,


Avatar
Christophe

bonjour,

map(lambda x : x[0], A)

ou encore

map(lambda x : x[:1], A)


c'est assez pythonique ? ... en tout cas c'est fonctionnel ;)




Ouh là là je trouve que c'est encore moins clair pour un profane ! ;-)
Je cherche en fait une solution qui soit aussi élégante que ce que l'on
fait avec Matlab :

A = [[1,2];[3,4]]
A(:,1)
[1, 3]



Merci quand même !


Avatar
Amaury Forgeot d'Arc
Bonjour,

Je butte sur un problème très simple et je ne trouve pas de solution
élégante.

Soit la matrice A par exemple de dimension 2 :
A = [[1,2],[3,4]]

donc A > 1 2
3 4

Je souhaiterais sélectioner la première colonne, donc [1,3] et la seule
méthode que j'ai trouvée est la suivante :
[A[i][0] for i in range(len(A))]

Autant dire que ce n'est pas très lisible !

Quelqu'un aurait-il une méthode plus 'pythonique' ?

Merci,


Moi, j'écrirais:
[a[0] for a in A]
qui est plus simple que ton exemple,
ou même:
zip(*A)[0]
Si si, ça marche ! zip peut servir à transposer une matrice...
même si c'est moins lisible au premier coup d'oeil !

Amaury

Avatar
F. Petitjean

bonjour,

map(lambda x : x[0], A)

ou encore

map(lambda x : x[:1], A)


c'est assez pythonique ? ... en tout cas c'est fonctionnel ;)




Ouh là là je trouve que c'est encore moins clair pour un profane ! ;-)
Non non cela peut être clair on peut écrire aussi

colonne_1 = [ ligne[0] for ligne in A ]
et cela ne me paraît pas obscur.
Je cherche en fait une solution qui soit aussi élégante que ce que l'on
fait avec Matlab :

A = [[1,2], [3,4]]
A(:,1)
[1, 3]


Pour imiter Matlab (c)(r):

import Numeric as N # ou numarray
A = N.array( ((1,2), (3, 4)), N.Int) # ou N.Float
A[:, 0] # première colonne

Remarquez que les indices en ython commencent à 0 (1 avec
Matlab/FORTRAN)

Attention pour un tel tableau on n'a qu'une version en mémoire, il n'y a
pas copie du contenu
A[:, 0] = N.zeros((2,), N.Int)
et la matrice n'est plus inversible :
A
array([[0, 2],



[0, 4]])


Merci quand même !




Avatar
Do Re Mi chel La Si Do
Bonsoir !

Et sans le range ?

[i[0] for i in A]

AMHA, ça marche aussi bien.



@-salutations
--
Michel Claveau
Avatar
Christophe
On 10 Mar 2005 19:56:47 GMT, "F. Petitjean"
wrote :


bonjour,

map(lambda x : x[0], A)

ou encore

map(lambda x : x[:1], A)


c'est assez pythonique ? ... en tout cas c'est fonctionnel ;)




Ouh là là je trouve que c'est encore moins clair pour un profane !
;-)
Non non cela peut être clair on peut écrire aussi

colonne_1 = [ ligne[0] for ligne in A ]
et cela ne me paraît pas obscur.
Je cherche en fait une solution qui soit aussi élégante que ce que
l'on fait avec Matlab :

A = [[1,2], [3,4]]
A(:,1)
[1, 3]


Pour imiter Matlab (c)(r):

import Numeric as N # ou numarray
A = N.array( ((1,2), (3, 4)), N.Int) # ou N.Float
A[:, 0] # première colonne

Remarquez que les indices en ython commencent à 0 (1 avec
Matlab/FORTRAN)

Attention pour un tel tableau on n'a qu'une version en mémoire, il n'y
a pas copie du contenu
A[:, 0] = N.zeros((2,), N.Int)
et la matrice n'est plus inversible :
A
array([[0, 2],



[0, 4]])



Effectivement c'est élégant mais cela a l'inconvénient de dépendre d'un
import et numarray ne fonctionne qu'avec des nombres.
Je cherchais une solution générique qui puisse convenir partout...

Merci !




Avatar
Christophe


bonjour,

map(lambda x : x[0], A)

ou encore

map(lambda x : x[:1], A)


c'est assez pythonique ? ... en tout cas c'est fonctionnel ;)





Ouh là là je trouve que c'est encore moins clair pour un profane !
;-) Je cherche en fait une solution qui soit aussi élégante que ce
que l'on fait avec Matlab :


A = [[1,2];[3,4]]
A(:,1)



[1, 3]

Merci quand même !


de rien,

cette solution a l'avantage de ne pas dependre d'un import,
et de marcher avec n'importe quel type de donnee,
et d'eviter de copier la liste,

en plus c'est tres elegant... mais ce dernier point est subjectif ;)



Effectivement c'est plutôt élégant mais néanmoins peu compréhensible au
premier abord...
Je pense cependant que je vais l'adopter car je suppose que utiliser map
est beaucoup plus rapide que de faire ce que les autres ont proposé (qui
est plus lisible mais peut-être plus lent) :
[ligne[0] for ligne in A]

Est-ce que je me trompe ? ou c'est kif kif dans tous les cas ?

Merci pour l'astuce en tout cas !




Avatar
Christophe
On Thu, 10 Mar 2005 20:51:48 +0100, Amaury Forgeot d'Arc


Je butte sur un problème très simple et je ne trouve pas de solution
élégante.

Soit la matrice A par exemple de dimension 2 :
A = [[1,2],[3,4]]

donc A > > 1 2
3 4

Je souhaiterais sélectioner la première colonne, donc [1,3] et la
seule méthode que j'ai trouvée est la suivante :
[A[i][0] for i in range(len(A))]

Autant dire que ce n'est pas très lisible !

Quelqu'un aurait-il une méthode plus 'pythonique' ?

Merci,


Moi, j'écrirais:
[a[0] for a in A]
qui est plus simple que ton exemple,
ou même:
zip(*A)[0]
Si si, ça marche ! zip peut servir à transposer une matrice...
même si c'est moins lisible au premier coup d'oeil !



Effectivement à ma grande surprise avec zip ça marche aussi.
Par contre je n'ai rien compris à ce que fais exactement zip (l'aide en
ligne est incompréhensible pour moi) et je ne connais pas cette syntaxe
avec l'* ?!? C'est comme en C ? ça s'utilise comme un pointeur ? ;-)