Untermatrizen erzeugen - Fehlermeldung

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
Benutzeravatar
Python_BOON
User
Beiträge: 4
Registriert: Dienstag 12. Juli 2016, 16:01

Hallo,

ich habe folgendes Problem:

ich möchte eine Matrix in 9 Untermatrizen aufteilen, dazu hab ich folgendes Programm (Auszug) geschrieben:

Code: Alles auswählen

	 	 for x in matrix_liste_anzahl:
         	globals()["matrix_%s" % laufparameter_2] = np.zeros((height_neu,width_neu))
         	laufparameter_2 += 1
		  matrix_liste_anzahl = range(9)
		  matrix_seite_liste = range(3)
        laufparameter_2 = 0
        a = 0
        a_neu = height_neu
        b = 0
        b_neu = width_neu
        print ("a=%s a_neu=%s b=%s b_neu=%s" % (a, a_neu, b, b_neu))
        print matrix.shape
        print matrix_0.shape
        # Untermatrizen aus Ursprungsmatrix bilden
        for x in matrix_liste_anzahl:
            for y in anzahl_seite_liste:
                globals()["matrix_%s" % (laufparameter_2)][a:a_neu,b:b_neu] = matrix[a:a_neu,b:b_neu]
                b_neu = b_neu + width_neu
                b = b + width_neu
                laufparameter_2 += 1
            b_neu = width_neu
            a_neu = a_neu + height_neu
            a = a + height_neu
Wenn ich das ausführe kommt folgendes:

Code: Alles auswählen

=============== RESTART: /var/www/html/Bildanalyse_fein_0.1.py ===============
Start des Programms
2016-07-12 17:14:57.549110
a=0 a_neu=85 b=0 b_neu=113
(768, 1024)
(85, 113)

Traceback (most recent call last):
  File "/var/www/html/Bildanalyse_fein_0.1.py", line 113, in <module>
    globals()["matrix_%s" % (laufparameter_2)][a:a_neu,b:b_neu] = matrix[a:a_neu,b:b_neu]
ValueError: could not broadcast input array from shape (85,113) into shape (85,0)
>>> 
Ich habe allerdings keine Ahnung was mein Fehler ist (oder was die Fehlerausgabe mir sagen soll) bzw wie ich es sonst anders machen soll.

Es muss auch nicht schön aussehen, es muss nur funktionieren. Bevor hier fragen entstehen wofür ich das brauche: Im Grunde soll es am Ende eine Art FEM werden, aber dafür brauche ich diese Methode die Matrix in einzelne kleinere Teilmatrizen zu zerlegen.

Es wäre wirklich super, wenn jmd da zu eine Idee hätte, vielleicht habe ich auch nur nen Denkfehler drin.

VIelen Dank und MFG
Basti
Sei wie du bist.
BlackJack

@Python_BOON: Bevor Du dem Problem auf den Grund gehst, solltest Du erst einmal eine Lösung ohne globale Variablen entwerfen. Und dazu noch welche mit dynamisch erzeugten Namen. Das macht man nicht. Weder globale Variablen, noch Variablennamen dynamisch erzeugen.
Benutzeravatar
Python_BOON
User
Beiträge: 4
Registriert: Dienstag 12. Juli 2016, 16:01

Die Sache ist die, warum möchte ich dynamisch erzeugte Variablen nutzen?

Weil das ganze System am Ende auch vollkommen variabel einsetzbar sein soll, heißt ich brauche x-erzeugte durchnummerierte variablen in denen dann jeweils eine Matrix steht.

Mal ohne Code in Grunde so:
anzahl_untermatrix=10
-> erzeuge anzahl_untermatrix variablen mit namen matrix_1, matrix_2, usw

die erstmal leer sind, beschreiben tue ich sie ja dann noch. Das System soll halt adaptiv sein, heißt ich ändere oben die Anzahl und das Programm wirft mir dann halt statt 9 vielleicht 25 untermatrizen aus, die jeweils in einer eigenen Variable stehen sollen.

Warum globale Variable? Ich weiß nicht, wie ich sonst dynamische Variablen erzeugen soll. (Habe in der Richtung nichts gefunden, vielleicht mit locals()? und sind die dann auch überall nutzbar?)

Aber im Grunde sollte es nicht daran scheitern/liegen, dass ich solche Variablen nutze oder? Ich weiß einfach nicht, warum er bei (sinngemäß):

matrix_0[a:a_neu,b:b_neu] = matrix[a:a_neu,b:b_neu] nicht einfach denjenigen teil aus matrix in matrix_0 schreibt, sondern einen ValueError ausgibt.
Sei wie du bist.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Python_BOON: Um das was BlackJack geschrieben hat zu konkretisieren, ersetze globals()["matrix_%s" % laufparameter_2] durch eine Liste submatrices, an die Du Deine Submatrizen anhängst. Dazu ist es nicht nötig, diese Liste erst mit 0-Matrizen zu füllen, die ersten drei Zeilen Deines Codes sind also unnötig.

Wenn Du wissen willst, warum der Fehler auftritt, gib am besten die Werte von a, a_neu, b und b_neu aus, die sie haben, wenn der Fehler auftritt, oder eigentlich in jedem Schleifendurchgang, damit Du siehst, warum die Werte falsch sind.
Benutzeravatar
Python_BOON
User
Beiträge: 4
Registriert: Dienstag 12. Juli 2016, 16:01

Wenn ich so darüber nachdenke wäre es mit einer liste vlt sogar möglich. Dazu direkt eine Frage (die bestimmt ziemlich dumm klingt):

Wie greife ich zb. auf das Element [5,10] in der Matrix 3 in der Liste(matrix1, matrix2, matrix3, ...) zu. (Weshalb ich wohl auch jede in eine eigene Variable scheiben wollte)

Und dann werde ich das morgen im Labor mal so mit Liste anpassen und mal schauen was eigentlich die Parameter a, b, usw machen.

Wobei mir glaub ich jetzt gerade ein Gedankenblitz gekommen ist, warum das nicht klappen KÖNNTE:
Die Matrix in die ich schreibe hat ja die Dimension [a,b]
wenn ich nun a und b erhöhe, kann er nicht mehr in diese Matrix schreiben, da diese Positionen nicht existieren.

Ich werde es morgen testen und Rückmeldung geben.

Vielen Dank
Sei wie du bist.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Python_BOON: auf Listenelemente greift man auch mit Eckigen Klammern zu: submatrices[3][5, 10]. Das Erzeugen der Untermatrizen könnte ungefähr so aussehen:

Code: Alles auswählen

width = 83
height = 113
    
submatrices = [
    matrix[x:x+width,y:y+height]
    for x in range(0, matrix.shape[0], width)
    for y in range(0, matrix.shape[1], height)
]
Benutzeravatar
Python_BOON
User
Beiträge: 4
Registriert: Dienstag 12. Juli 2016, 16:01

Danke für die Hilfe, leider kann ich erst wieder am Montag an dem Code arbeiten, musste gestern und noch heute/morgen einen anderen Code fertig machen, aber selbst da hat mir das mit der Liste sehr geholfen, habe das dort implementiert und bin begeistert wie gut das funktioniert :) (Hatte Listen vorher nicht ganz verstanden wie sie funktionieren, habe es mir nun nochmal richtig angeschaut)

Falls dann am Montag noch Probleme entstehen, werde ich nochmal um eure Hilfe bitten :)

Danke und LG
Sei wie du bist.
Antworten