Spalten aus Matrix löschen (Matlab Befehl => Python Befehl)

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
hukd321
User
Beiträge: 12
Registriert: Dienstag 31. Juli 2012, 16:07

Hey,

ich hab hier in einem MATLAB-Code eine ziemlich wilden Befehl:

Code: Alles auswählen

MatrixTemp = AMatrix(:, index(aufteilung~=k))
- AMatrix ist eine (100 x 200) Matrix
- index ist eine Zufallszahl zwischen 0 und 199 (also im Bereich der Spalten der Matrix)
- k ist Zähler einer For-schleife, der in Range(0, Faltung) - hier Faltung = 5 - annimmt
- aufteilung ist ein Vektor, der die 200 Spalten der AMatrix indiziert hat gemäß der Faltung => die ersten 20 Spalten sind mit "0" indiziert, die nächsten mit "1", ... die Spalten 180-199 mit "4"

Sofern ich den MATLAB Code jetzt richtig verstanden habe, ist MatrixTemp die Matrix, die alle Spalten hat, die nicht den index "k" haben!
Sprich, wenn k = 0, dann hat MatrixTemp die Spalten 20-199 der AMatrix!

Problem: Wie kann ich denn sowas in Python verwirklichen?


Vielen Dank für eure Hilfe :)
BlackJack

@hukd321: Grundsätzlich dürfte die Antwort „slicing” lauten, aber ich habe noch nicht verstanden wie das Ergebnis zustande kommen soll.

Bei der Beschreibung der Bestandteile des MATLAB-Ausdrucks habe zwei Verständisfragen:

1. Wie spielt `index` in das Ergebnis hinein? Und was erhält man bei MATLAB wenn man einen skalar indexiert?

2. Wie kommen die Werte in Aufteilung zustande? Wenn ich die ersten 20 Spalten mit 0 „adressiere”, die nächsten 20 mit 1, und so weiter, dann komme ich bei 4 nicht bei 180 an‽

Ansonsten mal einfaches „slicing” wobei ich die Zahlen durch 10 geteilt habe, damit man das noch problemlos alles in der Konsole anzeigen kann:

Code: Alles auswählen

In [106]: k
Out[106]: 0

In [107]: a_matrix
Out[107]: 
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,  27,  28,  29,  30,  31,  32,
         33,  34,  35,  36,  37,  38,  39],
       [ 40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,
         53,  54,  55,  56,  57,  58,  59],
       [ 60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,
         73,  74,  75,  76,  77,  78,  79],
       [ 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,
         93,  94,  95,  96,  97,  98,  99],
       [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
        113, 114, 115, 116, 117, 118, 119],
       [120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
        133, 134, 135, 136, 137, 138, 139],
       [140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152,
        153, 154, 155, 156, 157, 158, 159],
       [160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
        173, 174, 175, 176, 177, 178, 179],
       [180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
        193, 194, 195, 196, 197, 198, 199]])

In [108]: aufteilung
Out[108]: array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9])

In [109]: a_matrix[:, aufteilung != k]
Out[109]: 
array([[  2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
         15,  16,  17,  18,  19],
       [ 22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,
         35,  36,  37,  38,  39],
       [ 42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,
         55,  56,  57,  58,  59],
       [ 62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,
         75,  76,  77,  78,  79],
       [ 82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,
         95,  96,  97,  98,  99],
       [102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
        115, 116, 117, 118, 119],
       [122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
        135, 136, 137, 138, 139],
       [142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
        155, 156, 157, 158, 159],
       [162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
        175, 176, 177, 178, 179],
       [182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
        195, 196, 197, 198, 199]])
hukd321
User
Beiträge: 12
Registriert: Dienstag 31. Juli 2012, 16:07

hey und danke für deine antwort!
also es geht hier im prinzip um die verwirklichung von kreuzvalidierung!
ich weiß nicht, in wie weit du damit schon damit gearbeitet hast!

erst mal zu:
2. Wie kommen die Werte in Aufteilung zustande? Wenn ich die ersten 20 Spalten mit 0 „adressiere”, die nächsten 20 mit 1, und so weiter, dann komme ich bei 4 nicht bei 180 an‽
War ja natürlich auch totaler Quatsch! Die Spalten 0-39 werden mit 0, ... , die Spalten 160-199 werden mit 4 adressiert
Man könnt meinen, ich kann 200 nicht durch 5 teilen :evil:

zu:
1. Wie spielt `index` in das Ergebnis hinein? Und was erhält man bei MATLAB wenn man einen skalar indexiert?
da hab ich auch selbst etwas falsch beschrieben (bzw bis eben falsch verstanden)! Index ist keine Zufallszahl, sondern ein Zufallsvektor gefüllt mit den Zahlen von 0 bis 199 (in zufälliger Reihenfolge) [kurzer Einschub: es geht um k-fache Kreuzvalidierung, das Prinzip ist hier in den ersten 30 Sekunden kurz erklärt youtube-video ]

Wir spielen das jetzt mal für k = 0, faltung = 5, eine AMAtrix der Größe (100 x 10) durch
dann hätten wir zB als index = [ 5 8 1 7 0 3 2 9 4 6 ]
Aufteilung wäre dann ein Vektor der so aussähe: aufteilung = [ 0 0 1 1 2 2 3 3 4 4 ]

somit wäre (aufteilung=~k) = aufteilung=~0 = [ 0 0 1 1 1 1 1 1 1 1 1 1 ] => klar, nur die ersten beiden sind mit "null" indiziert
und somit wäre dann das gesuchte: index(aufteilung~=k)) = index(aufteilung~=0)) = [ 1 7 0 3 2 9 4 6 ]

Folglich wäre MatrixTemp = [ 1. Spalte 7. Spalte 0. Spalte ... 6. Spalte ] der AMatrix




ich hoffe, durch mein Beispiel ist das ein wenig klarer geworden (wie ich anhand des index-vektors merke, ist es dies v.a. auch für mich ;) )



edit:
erstaunlicherweise scheint es jetzt, nach abänderung des index (von Wert auf Vektor^^) zumindest etwas plausibles zu liefern (nämlich eine matrix), wenn ich den Befehl aus Matlab quasi 1zu1 übernehme, natürlich halt mit != anstatt ~= und eckigen Klammern...
Antworten