Mehrere Spalten auswählen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
heraklit
User
Beiträge: 31
Registriert: Donnerstag 8. März 2007, 16:50

Donnerstag 8. März 2007, 16:56

Hallo,

ich möchte aus einer Matrix mehrere Spalten auswählen.Nun weiß ich, wie man aus einer Matrix eine Spalte auswählt, frage mich aber ob das ganze mit einem Befehl erledigen kann. D.h. Ich möchte mit einem Befehl die Spalten 1 und 3 einer Matrix auswählen und eine Matrix erhalten, die nur die Spalten 1 und 3 erhält. Eine Auswahl einer Spalte funktioniert (zur Info) folgendermaßen:

Code: Alles auswählen

import Numeric as N
...
A = N.zeros((3,6),N.Float)
A[0,0]=1
A[1,0]=1
A[2,0]=1
A[1,1]=1
A[2,1]=2
A[0,2]=1
A[0,3]=1
A[1,4]=1
A[2,5]=1
tmp = A[:,0]
Hierdurch wird die erste Spalte ausgewählt. Natürlich könnte man jetzt die Matrix durch Schleifen iterativ aufbauen. Wie gesagt suche ich aber nach einer einfacheren Möglichkeit bzw. einem einzigen Befehl der mehrere Spalten auswählt.

mfg
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 8. März 2007, 17:40

Hoi und willkommen im Forum!

Vorweg: Warum benutzt Du noch Numeric? Du kennst numpy?

Zur Frage: Was Du suchst nennt sich array slicing. Beispiel gefällig (das ganz unten sollte zeigen, was Du suchst)?

Code: Alles auswählen

>>> a
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],
       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],
       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])
>>> a[0, 1:3]
array([[3, 4, 5],
       [6, 7, 8]])
>>> a[1:, 1:]
array([[[12, 13, 14],
        [15, 16, 17]],
       [[21, 22, 23],
        [24, 25, 26]]])
>>> a[:, 1]
array([[ 3,  4,  5],
       [12, 13, 14],
       [21, 22, 23]])
>>> a[1::1, ::1]
array([[[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],
       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])
Dokumentation zu numpy & Numeric ist natürlich auch vorhanden.

Gruß,
Christian

edit: Eindeutigen Hinweis eingebaut.
BlackJack

Donnerstag 8. März 2007, 17:48

Ich weiss nicht ob slicing wirklich das richtige ist. So wie ich das verstanden habe sollen es beliebige Spalten sein, mit slicing bekommt man doch aber nur "regelmässige" auswahlen hin, also sowas wie "jede zweite im Bereich von x bis y". Beliebige Spalten bekommt man mit der `take()`-Funktion.

Code: Alles auswählen

In [120]: a = Numeric.arange(3*6).resize((3, 6))

In [121]: a
Out[121]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17]])

In [122]: Numeric.take(a, (1, 3), 1)
Out[122]:
array([[ 1,  3],
       [ 7,  9],
       [13, 15]])
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 8. März 2007, 18:03

Das ist korrekt, aber mit take kann man keine (direkten) Zuweisungen machen. Und ich hatte die Frage - durch das Codebeispiel - so verstanden, daß heraklit nicht nur auswählen, sondern auch zuweisen will. Da allerdings würde sich dann natürlich "put" empfehlen ... und das dürfte auch eine ganz einfache Lösung sein.

Gruß,
Christian
heraklit
User
Beiträge: 31
Registriert: Donnerstag 8. März 2007, 16:50

Donnerstag 8. März 2007, 18:14

Gut, danke schön. Der take-Befehl ist genau das wonach ich gesucht habe :)
viele grüße
Antworten