Spalte in Array ersetzen

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
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Guten Abend :D

ich habe folgendes Problem:

Ich habe eine 22 X 17 Matrix (ecz) und möchte die erste Zeile ersetzen.
l1, l2 sind dabei Längen die vom Nutzer vorgegeben werden können.

Ich habe mir da folgendes bis jetzt überlegt

Code: Alles auswählen

    
# Erste Spalte mit X-Werten im Intervall erzeugen
x1 = numpy.linspace(0, l1, 11)
x2 = numpy.linspace(l1, l2+l1, 11)
# fuegt die beiden zusammen und macht einen 1 Zeilenvektor daraus
x = numpy.hstack((x1[:10] , x2[:11]))
# wandelt diese um in 21 Zeilen
x = numpy.reshape(x,(21,1))
#löscht die erste Zeile
ecz = numpy.delete(ecz, 0 ,1)
#sollte eine neue erste Zeile schreiben
ecz = numpy.insert(ecz, 0 ,x, axis=1)
Leider funktioniert der letzte Schritt nicht.
Hat jmd. einen Ansatz wie man dies lösen könnte ?

MfG
Mathman
BlackJack

@mathman: Könntest Du mal beschreiben was da nicht funktioniert? Und was Du da haben möchtest? Du hast etwas im Format (21, 1) und möchtest das in eine *Zeile* schreiben? Die dazu auch noch 22 Elemente aufnimmt und nicht nur 21!? Und ausserdem war `x` mal in einer "Zeilenform" und Du wandelst das bevor Du eine Zeile daraus machen willst erst in eine Spalte um? Warum? Oder hat `ecz` die Form (17, 22)?
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Geht es noch immer um dieses Problem?

Ich habe so ein bisschen das Gefühl, dass du NumPy-Arrays benutzt um Excel-Tabellen abzubilden. Spalten kopieren, löschen, einfügen, etc. Dafür sind NumPy-Arrays aber eher ungeeignet, da unter anderem der Datentyp fix ist. Vom physikalischen Standpunkt aus, sollten die Objekte im Array zusätzlich immer die gleiche physikalische Größe beschreiben. Also niemals z.B. Zeit und Kraft in einen Array packen. Was sind denn "l1", "l2", "ecz", "x1" und "x2" für Objekte und wofür stehen sie?

Grüße
Gerrit
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Guten Morgen,

das ist mir heute morgen auch eingefallen das ich das Problem wahrscheinlich zu ungenau beschrieben habe.
gkuhl hat geschrieben:Geht es noch immer um dieses Problem?

Ich habe so ein bisschen das Gefühl, dass du NumPy-Arrays benutzt um Excel-Tabellen abzubilden. Spalten kopieren, löschen, einfügen, etc. Dafür sind NumPy-Arrays aber eher ungeeignet, da unter anderem der Datentyp fix ist. Vom physikalischen Standpunkt aus, sollten die Objekte im Array zusätzlich immer die gleiche physikalische Größe beschreiben. Also niemals z.B. Zeit und Kraft in einen Array packen. Was sind denn "l1", "l2", "ecz", "x1" und "x2" für Objekte und wofür stehen sie?

Grüße
Gerrit
Ja genau, das ist für das Modul, jedoch bin ich da jetzt ein Stück weiter. Mein Fehler vielleicht hätte ich besser da weiter schreiben sollen.

Also das Modul berechnet die Schnittkräfte für einen 1-Feld, 2-Feld sowie 3-Feld Träger. Man bekommt dadurch dann die Momente, Querkraft, den Verdrehungswinkel phi, und die Durchbiegung des Trägers. Das Verfahren was dahinter steckt ist ein Mix aus Reduktionsverfahren der Übertragungsmatrizen und dem Weggrößenverfahren. Das ganze benötige ich um eine "Bemessungshilfe für eine Spannbetondurchlaufträger" zu erstellen und die Module die da nachkommen sind auf die Rückgabewerte des Moduls angewiesen.

Der Benutzer kann sich bei der Eingabe entscheiden, wie viel Träger er hat (also 1 -3). Die Träger dürfen unterschiedlich lang sein, l1 ist dabei die Länge des ersten Trägers, l2 die des zweiten und l3 dann die des dritten Trägers :mrgreen:
In x1 stehen dann alle x-Werte drinne für der den ersten Träger, also an welcher Stelle [m] was berechnet wurde.
x2 ist dann für den 2. Träger der dann normalerweise wieder bei 0 losgehen würde, jedoch lasse ich diesen nun
an der letzten Stelle von x los gehen bis er die Länge von l1 + l2 erreicht.

Also:
in x1 steht dann bspw. [0,1,2,3,4,5,6,7,8,9,10] das ist dann für einen 10 m langen Träger, wo an 11 Stellen eine Berechnung durchgeführt wird
in x2 steht dann [10,11,12,13,14,15,16,17,18,19,20] auch für einen 10 m langen Träger. Der Plot später soll an dem Gesamtsystem ausgegben werden.
Also gehts bei 0 los bis ich 20 erreicht habe. x ist dabei die Einteilung für die x-Achse.

ecz ist dabei mein Container, wo ich in jeder Zeile [x, V, M, phi, w] rein speichere. Bei der Berechnung ist ab dem 2. Träger das x nicht mehr korrekt und muss durch das richtige ersetzt werden, denn x ist meine Variable wo drinne steht, an welchem Punkt des Trägers ich gerade die Wertee berechnet habe. Damit geh ich dann später in mathplot und lasse mir das ausgeben.

Den Teil den gkuhl meint ist der folgende, plus meiner Ergänzung damit ich anständig plotten kann

Code: Alles auswählen

# ecz Ergbinsse Container der Zwischenschnittgroessen fuer das Zeichnen, [x,V,M,phi,w, V,M,phi,w]] (Lastfall 1-4) 
    ecz = numpy.array([])
    # s Zaehlvariabele fuer die Staebe
    for s in range(0,2):
      # l Zaehltvariabel fuer die Lastfaelle
      for l in range(0,4):
        # i Zaehlvariabel fuer die Intervalle der Zwischenschnittgroessen eines Stabes
        for i in range(0,11):
          #print asm[0,l,s]
        
          x = i/10. * lsl[s]
        
          V = (asm[0,l,s]) - p[s,l] * x        
          
          M = (asm[0,l,s]) * x + (asm[1,l,s]) - p[s,l] * x**2 / 2
        
          phi = (((asm[0,l,s]) * (x**2 / 2) + (asm[1,l,s]) * x - p[s,l] * ( x**3 / 6)) / steifigkeit) + (asm[3,l,s])
        
          w = (((- (asm[0,l,s]) * (x**3 /6) - (asm[1,l,s]) * (x**2 / 2) + p[s,l] * (x**4 / 24)) / steifigkeit) - (asm[3,l,s]) * x + (asm[2,l,s]))*1000
          
          # e Berechnung der Zwischenwerte fuer V, M, w, phi
          e = numpy.array([x, V, M, phi, w])
          ecz = numpy.append(ecz, e, axis=0)
          
    # Stabweise teilen      
    ecz = numpy.split(ecz, 2, axis = 0)
   
    # ecz1 Ergbinsse Container der Zwischenschnittgroessen Stab 1, in 44x5 Matrix konvertieren, 11x20 Matrix konvertieren, x in 5.,10,15 Spalte loeschen
    ecz1 = numpy.reshape(ecz[0], (44,5))
    ecz1 = numpy.hstack((ecz1[:11], ecz1[11:22], ecz1[22:33], ecz1[33:44]))
    ecz1 = numpy.delete(ecz1, [5,10,15], axis=1)

    
    # ecz2 Ergbinsse Container der Zwischenschnittgroessen Stab 2, in 44x5 Matrix konvertieren, 11x20 Matrix konvertieren, x in 5.,10,15 Spalte loeschen
    ecz2 = numpy.reshape(ecz[1], (44,5))
    ecz2 = numpy.hstack((ecz2[:11], ecz2[11:22], ecz2[22:33], ecz2[33:44]))
    ecz2 = numpy.delete(ecz2, [5,10,15], axis=1)
    
    # ecz vertikal zusammenfuegen von ecz1, ecz2, runden   
    ecz = numpy.vstack((ecz1, ecz2))    
    ecz = numpy.round(ecz, decimals=10)
    
    # Erste Spalte mit X-Werten ueber alle Felder korrigiern
    x1 = numpy.linspace(0, l1, 11)
    x2 = numpy.linspace(l1, l2+l1, 11)
    x = numpy.hstack((x1[:10] , x2[:11]))
    x = numpy.reshape(x,(21,1))
    ecz = numpy.delete(ecz, 0 ,1)
    ecz = numpy.insert(ecz, 0 ,x, axis=1)
und weiter unten komme ich zum Plot

Code: Alles auswählen

  #Plot  x,y
  plt.plot(ecz[:,0] , (ecz[:,2])*-1)
  plt.ylabel('Moment [kN/m]')
  plt.xlabel('Laenge [m]')
  plt.title('Momentenverlauf')
  plt.grid() # Gitternetz zeichnen
  plt.show()
Mit dem Plot möchte ich genau das erreichen, was ich in dem anderen Thread als Anschauungsbeispiel in Excel erzeugt habe. Bild
Später soll das natürlich der Plot erledigen :D

Die x-Werte habe ich in der Exceltabelle per Hand geändert da diese nicht stimmen.
Man muss beim Anfang des neuen Träger immer den letzten x Wert des vorherigen Tägers dazurechnen, denn für die Berechnung selbst fängt x bei 0 wieder an. Denn jeder Träger wird seperat berechnet.

Das mit dem Plot funktioniert beim Einfeldträger, da es nur diesen einen gibt und kein weitere dazukommt wo die x Werte wieder von 0 los gehen.

Den Fehler den ich erhalte ist
File "/home/nutzer/workspace/sb2brain/src/schnitt_test.py", line 498, in schnittkraefte
ecz = numpy.insert(ecz, 0 ,x, axis=1)
File "/usr/lib/python2.6/dist-packages/numpy/lib/function_base.py", line 3153, in insert
new[slobj] = values
ValueError: array dimensions are not compatible for copy
In ecz steht vor dem edieren
Dabei ist die Dimension der Schnittgroessen Martrix (22, 17)
[[ 0.00000000e+00 3.75000000e+01 0.00000000e+00 -3.46790000e-06
0.00000000e+00 7.50000000e+01 0.00000000e+00 -6.93580000e-06
0.00000000e+00 8.75000000e+01 0.00000000e+00 -1.04037000e-05
0.00000000e+00 -1.25000000e+01 -0.00000000e+00 3.46790000e-06
0.00000000e+00]
[ 1.00000000e+00 2.75000000e+01 3.25000000e+01 -3.18350000e-06
3.37078650e-03 5.50000000e+01 6.50000000e+01 -6.36700000e-06
6.74157300e-03 6.75000000e+01 7.75000000e+01 -9.73090000e-06
1.01747815e-02 -1.25000000e+01 -1.25000000e+01 3.36390000e-06
-3.43320850e-03]
[ 2.00000000e+00 1.75000000e+01 5.50000000e+01 -2.44140000e-06
6.21445420e-03 3.50000000e+01 1.10000000e+02 -4.88280000e-06
1.24289083e-02 4.75000000e+01 1.35000000e+02 -7.93450000e-06
1.90872520e-02 -1.25000000e+01 -2.50000000e+01 3.05170000e-06
-6.65834370e-03]
[ 3.00000000e+00 7.50000000e+00 6.75000000e+01 -1.40800000e-06
8.15647110e-03 1.50000000e+01 1.35000000e+02 -2.81590000e-06
1.63129422e-02 2.75000000e+01 1.72500000e+02 -5.34750000e-06
2.57802747e-02 -1.25000000e+01 -3.75000000e+01 2.53160000e-06
-9.46733250e-03]
[ 4.00000000e+00 -2.50000000e+00 7.00000000e+01 -2.49700000e-07
8.98876400e-03 -5.00000000e+00 1.40000000e+02 -4.99400000e-07
1.79775281e-02 7.50000000e+00 1.90000000e+02 -2.30270000e-06
2.96296296e-02 -1.25000000e+01 -5.00000000e+01 1.80330000e-06
-1.16521015e-02]
[ 5.00000000e+00 -1.25000000e+01 6.25000000e+01 8.67000000e-07
8.66971840e-03 -2.50000000e+01 1.25000000e+02 1.73390000e-06
1.73394368e-02 -1.25000000e+01 1.87500000e+02 8.67000000e-07
3.03440144e-02 -1.25000000e+01 -6.25000000e+01 8.67000000e-07
-1.30045776e-02]
[ 6.00000000e+00 -2.25000000e+01 4.50000000e+01 1.77560000e-06
7.32417810e-03 -4.50000000e+01 9.00000000e+01 3.55110000e-06
1.46483562e-02 -3.25000000e+01 1.65000000e+02 3.82850000e-06
2.79650437e-02 -1.25000000e+01 -7.50000000e+01 -2.77400000e-07
-1.33166875e-02]
[ 7.00000000e+00 -3.25000000e+01 1.75000000e+01 2.30960000e-06
5.24344570e-03 -6.50000000e+01 3.50000000e+01 4.61920000e-06
1.04868914e-02 -5.25000000e+01 1.22500000e+02 6.24910000e-06
2.28672493e-02 -1.25000000e+01 -8.75000000e+01 -1.62990000e-06
-1.23803579e-02]
[ 8.00000000e+00 -4.25000000e+01 -2.00000000e+01 2.30270000e-06
2.88528230e-03 -8.50000000e+01 -4.00000000e+01 4.60540000e-06
5.77056460e-03 -7.25000000e+01 6.00000000e+01 7.79580000e-06
1.57580802e-02 -1.25000000e+01 -1.00000000e+02 -3.19050000e-06
-9.98751560e-03]
[ 9.00000000e+00 -5.25000000e+01 -6.75000000e+01 1.58830000e-06
8.73907600e-04 -1.05000000e+02 -1.35000000e+02 3.17660000e-06
1.74781520e-03 -9.25000000e+01 -2.25000000e+01 8.13570000e-06
7.67790260e-03 -1.25000000e+01 -1.12500000e+02 -4.95910000e-06
-5.93008740e-03]
[ 1.00000000e+01 -6.25000000e+01 -1.25000000e+02 0.00000000e+00
0.00000000e+00 -1.25000000e+02 -2.50000000e+02 0.00000000e+00
0.00000000e+00 -1.12500000e+02 -1.25000000e+02 6.93580000e-06
0.00000000e+00 -1.25000000e+01 -1.25000000e+02 -6.93580000e-06
-0.00000000e+00]
[ 0.00000000e+00 6.25000000e+01 -1.25000000e+02 0.00000000e+00
0.00000000e+00 1.25000000e+02 -2.50000000e+02 0.00000000e+00
0.00000000e+00 1.25000000e+01 -1.25000000e+02 6.93580000e-06
0.00000000e+00 1.12500000e+02 -1.25000000e+02 -6.93580000e-06
0.00000000e+00]
[ 1.00000000e+00 5.25000000e+01 -6.75000000e+01 -1.58830000e-06
8.73907600e-04 1.05000000e+02 -1.35000000e+02 -3.17660000e-06
1.74781520e-03 1.25000000e+01 -1.12500000e+02 4.95910000e-06
-5.93008740e-03 9.25000000e+01 -2.25000000e+01 -8.13570000e-06
7.67790260e-03]
[ 2.00000000e+00 4.25000000e+01 -2.00000000e+01 -2.30270000e-06
2.88528230e-03 8.50000000e+01 -4.00000000e+01 -4.60540000e-06
5.77056460e-03 1.25000000e+01 -1.00000000e+02 3.19050000e-06
-9.98751560e-03 7.25000000e+01 6.00000000e+01 -7.79580000e-06
1.57580802e-02]
[ 3.00000000e+00 3.25000000e+01 1.75000000e+01 -2.30960000e-06
5.24344570e-03 6.50000000e+01 3.50000000e+01 -4.61920000e-06
1.04868914e-02 1.25000000e+01 -8.75000000e+01 1.62990000e-06
-1.23803579e-02 5.25000000e+01 1.22500000e+02 -6.24910000e-06
2.28672493e-02]
[ 4.00000000e+00 2.25000000e+01 4.50000000e+01 -1.77560000e-06
7.32417810e-03 4.50000000e+01 9.00000000e+01 -3.55110000e-06
1.46483562e-02 1.25000000e+01 -7.50000000e+01 2.77400000e-07
-1.33166875e-02 3.25000000e+01 1.65000000e+02 -3.82850000e-06
2.79650437e-02]
[ 5.00000000e+00 1.25000000e+01 6.25000000e+01 -8.67000000e-07
8.66971840e-03 2.50000000e+01 1.25000000e+02 -1.73390000e-06
1.73394368e-02 1.25000000e+01 -6.25000000e+01 -8.67000000e-07
-1.30045776e-02 1.25000000e+01 1.87500000e+02 -8.67000000e-07
3.03440144e-02]
[ 6.00000000e+00 2.50000000e+00 7.00000000e+01 2.49700000e-07
8.98876400e-03 5.00000000e+00 1.40000000e+02 4.99400000e-07
1.79775281e-02 1.25000000e+01 -5.00000000e+01 -1.80330000e-06
-1.16521015e-02 -7.50000000e+00 1.90000000e+02 2.30270000e-06
2.96296296e-02]
[ 7.00000000e+00 -7.50000000e+00 6.75000000e+01 1.40800000e-06
8.15647110e-03 -1.50000000e+01 1.35000000e+02 2.81590000e-06
1.63129422e-02 1.25000000e+01 -3.75000000e+01 -2.53160000e-06
-9.46733250e-03 -2.75000000e+01 1.72500000e+02 5.34750000e-06
2.57802747e-02]
[ 8.00000000e+00 -1.75000000e+01 5.50000000e+01 2.44140000e-06
6.21445420e-03 -3.50000000e+01 1.10000000e+02 4.88280000e-06
1.24289083e-02 1.25000000e+01 -2.50000000e+01 -3.05170000e-06
-6.65834370e-03 -4.75000000e+01 1.35000000e+02 7.93450000e-06
1.90872520e-02]
[ 9.00000000e+00 -2.75000000e+01 3.25000000e+01 3.18350000e-06
3.37078650e-03 -5.50000000e+01 6.50000000e+01 6.36700000e-06
6.74157300e-03 1.25000000e+01 -1.25000000e+01 -3.36390000e-06
-3.43320850e-03 -6.75000000e+01 7.75000000e+01 9.73090000e-06
1.01747815e-02]
[ 1.00000000e+01 -3.75000000e+01 0.00000000e+00 3.46790000e-06
-0.00000000e+00 -7.50000000e+01 0.00000000e+00 6.93580000e-06
-0.00000000e+00 1.25000000e+01 -0.00000000e+00 -3.46790000e-06
0.00000000e+00 -8.75000000e+01 0.00000000e+00 1.04037000e-05
0.00000000e+00]]
Jetzt sollen halt immer die erste Spalte ( 0.00000000e+00, 1.00000000e+00, 2.00000000e+00, ... 9.00000000e+00, 1.00000000e+01)
durch das korrigierte X ersetzt werden.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Die erste Spalte überschreibst du einfach mit

Code: Alles auswählen

ecz[:, 0] = x # : als 1. Argument selektiert alle Zeilen, 0 als zweites wählt die 1. Spalte aus
Andere Spalten/Zeilen entsprechend. Delete kannst du dir sparen.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Ich rate dir dringend den Code erstmal zur Seite zu legen und das Problem nochmal mit etwas mehr Struktur anzugehen. Im Moment ist der Code extrem schlecht zu lesen. Du wirst ihn vermutlich in einem halben Jahr selbst nicht mehr lesen können.

1.) Mache dir Gedanken über eine einfache Datenstruktur, z.B. mit Dictionaries, die ruhig etwas verschachtelt sein kann ("Complex is better than complicated." Zen of Python). Dein jetztiger Ansatz mit einem 2d-Array wirst du vermutlich nur mehr Probleme bekommen. Der Code nach den drei for-Schleifen behandelt nur dieses Problem, das nicht existieren muss.

2.) Die drei for-Schleifen sind auch häßlich. Packe die einzelnen Arbeitsschritte (einen Lastfall berechnen, plotten, etc.) mal in Funktionen, die mit einfachen (maximal 1-dimensionalen) Datentypen arbeiten. Hier mal als Beispiel eine Funktion um den einen Lastfall zu berechnen:

Code: Alles auswählen

def berechne_lastfall(start, ende, schritte, konstanten):      
    x = np.linspace(0, ende-start, schritte)
    V = ...(konstanten)
    ...
    return x+start, V, M, phi, w

if __name__ == '__main__':
    x, V, M, phi, w = berechne_lastfall(12, 122, 32, (1.23, 42.0, np.pi)
Grüße
Gerrit
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Vielen Dank für eure Antworten :)
gkuhl hat geschrieben:Ich rate dir dringend den Code erstmal zur Seite zu legen und das Problem nochmal mit etwas mehr Struktur anzugehen. Im Moment ist der Code extrem schlecht zu lesen. Du wirst ihn vermutlich in einem halben Jahr selbst nicht mehr lesen können.
Gibt es denn irgendwo was man mal lesen könnte um besser Strukturierten Code zu schreiben ?

Problem ist, das ich das Programm als Bacholararbeit ende Februar abgeben muss, deswegen muss ich erst einmal als Autodidact
Masse schaffen und kümmere mich später um besseren Code. Mein Professor meinte, das wenn es gut wird dann darf ich dann
wenn ich im Masterstudium bin bei ihm noch weiter dran programmieren und weitere Funktionen einbauen. Erst einmal sitzt
mir leider die Zeit im Nacken :cry:

Was ist denn "Zen of Python" ? :mrgreen:

Die Änderungen die ich hier durch das Forum immer mit bekomme wie man besser programmiert baue ich dann immer sukzessiv in das Programm ein wenn ich "Luft" habe. z.B. linspace kannte ich erst nachdem du mir das geschrieben hattest :D
Darii hat geschrieben:Die erste Spalte überschreibst du einfach mit

Code: Alles auswählen

ecz[:, 0] = x # : als 1. Argument selektiert alle Zeilen, 0 als zweites wählt die 1. Spalte aus
Andere Spalten/Zeilen entsprechend. Delete kannst du dir sparen.
Ich habe das jetzt ausprobiert und dazu folgenden Code geschrieben

Code: Alles auswählen

# Erste Spalte mit X-Werten ueber alle Felder korrigiern
    x1 = numpy.linspace(0, l1, 11)
    x2 = numpy.linspace(l1, l2+l1, 11)
    x = numpy.hstack((x1[:10] , x2[:11]))
    x.resize(21,1)
    ecz[:, 0] = x # : als 1. Argument selektiert alle Zeilen, 0 als zweites wählt die 1. Spalte aus
Dabei habe ich reshape mit resize ersetzt, weil ich glaub das es das richtige ist...

jedoch bekomme ich noch folgenden Fehler:
File "/home/nutzer/workspace/sb2brain/src/schnitt_test.py", line 500, in schnittkraefte
ecz[:, 0] = x # : als 1. Argument selektiert alle Zeilen, 0 als zweites wählt die 1. Spalte aus
ValueError: array dimensions are not compatible for copy
wenn ich mir x ausgeben lasse hat x folgende Dimension:
[[ 0.]
[ 1.]
[ 2.]
[ 3.]
[ 4.]
[ 5.]
[ 6.]
[ 7.]
[ 8.]
[ 9.]
[ 10.]
[ 11.]
[ 12.]
[ 13.]
[ 14.]
[ 15.]
[ 16.]
[ 17.]
[ 18.]
[ 19.]
[ 20.]]
Kann das sein, dass es sich hier um einen Einzeilenvektor handelt wo ein Einspaltenvektor drinne ist und das deswegen nicht funktioniert und wenn ja wie kann ich das beheben das ich die selbe Dimensionen hin bekomme?

lg
Mathman
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

mathman hat geschrieben:Problem ist, das ich das Programm als Bacholararbeit ende Februar abgeben muss, deswegen muss ich erst einmal als Autodidact
Masse schaffen und kümmere mich später um besseren Code.
Hmm, klingt nach falscher Reihenfolge. Du hast ja schon Hinweise bekommen, wie du dein Problem besser strukturieren könntest. Zusammengeschusterten Code nochmal anzufassen dauert in der Regel wesentlich länger als strukturiert nochmal von vorne anzufangen.
BlackJack

@mathman: Wenn man erst "Masse schafft" und das dann später verbessert, bleibt oft viel vom schlechten Code liegen, ganz einfach weil man für so etwas dann nie wirklich Zeit hat, oder viel unübersichtlichen Quelltext hat, und nicht weiss wo man anfangen soll und/oder Angst hat, das jede Änderung etwas kaputt macht.

Zen of Python: ``import this`` im Interpreter ausführen. :-)

Schau Dir doch die Dimensionen an. Die sind als `shape`-Attribut verfügbar und müssen bei der Zuweisung halt zusammen passen. Wenn ich Deine Ausführungen richtig verstanden habe sollte das im Moment so aussehen:

Code: Alles auswählen

In [175]: x.shape
Out[175]: (21, 1)

In [176]: ecz[:,0].shape
Out[176]: (22,)
Die passen offensichtlich nicht zusammen. Zum einen weil `x` bei Dir zweidimensional ist, und zum anderen weil (mir) nicht so ganz klar ist wie Du 21 Werte auf 22 Array-Plätze verteilen möchtest.
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

mkesper hat geschrieben:
mathman hat geschrieben:Problem ist, das ich das Programm als Bacholararbeit ende Februar abgeben muss, deswegen muss ich erst einmal als Autodidact
Masse schaffen und kümmere mich später um besseren Code.
Hmm, klingt nach falscher Reihenfolge. Du hast ja schon Hinweise bekommen, wie du dein Problem besser strukturieren könntest. Zusammengeschusterten Code nochmal anzufassen dauert in der Regel wesentlich länger als strukturiert nochmal von vorne anzufangen.
Das ist richtig, nur muss man leider in einer bestimmten Zeit ein bestimmten Themenumfang durchackern und zum Schluß zählt
erst einmal dass das Programm funktioniert :|
BlackJack hat geschrieben:@mathman: Wenn man erst "Masse schafft" und das dann später verbessert, bleibt oft viel vom schlechten Code liegen, ganz einfach weil man für so etwas dann nie wirklich Zeit hat, oder viel unübersichtlichen Quelltext hat, und nicht weiss wo man anfangen soll und/oder Angst hat, das jede Änderung etwas kaputt macht.

Zen of Python: ``import this`` im Interpreter ausführen. :-)

Schau Dir doch die Dimensionen an. Die sind als `shape`-Attribut verfügbar und müssen bei der Zuweisung halt zusammen passen. Wenn ich Deine Ausführungen richtig verstanden habe sollte das im Moment so aussehen:

Code: Alles auswählen

In [175]: x.shape
Out[175]: (21, 1)

In [176]: ecz[:,0].shape
Out[176]: (22,)
Die passen offensichtlich nicht zusammen. Zum einen weil `x` bei Dir zweidimensional ist, und zum anderen weil (mir) nicht so ganz klar ist wie Du 21 Werte auf 22 Array-Plätze verteilen möchtest.


Das mit Zen ist lustig :P

Da ist ein Fehler von mir
x = numpy.hstack((x1[:11] , x2[:11]))
x.resize(22,1)
Es sollten natürlich 22 Werte sein.
Jedoch kann so leider immer noch nicht die erste Zeile ersetzen.
ecz[:, 0] = x # : als 1. Argument selektiert alle Zeilen, 0 als zweites wählt die 1. Spalte aus
ValueError: array dimensions are not compatible for copy
x hat die Deminsion von (22, 1) und ecz von (22, 17)
also wenn ich das richitg verstehe beide 22 Zeilen und x mit je einer Spalte und ecz dann 17 Spalten, da müsste man doch die erste ersetzen können :K

#Nachtrag#
gibt es denn ein gutes Buch wie man besseren Code schreiben kann?

lg
mathman
Zuletzt geändert von mathman am Montag 3. Januar 2011, 13:55, insgesamt 1-mal geändert.
BlackJack

@mathman: `ecz` hat Spalten und Zeilen. `ecz[:,0]` hat aber keine Spalten und Zeilen mehr sondern ist ein Array/"View" mit den Werten der ersten Spalte. Schau Dir die Sachen doch einfach mal im Interpreter an, wie die aussehen und welche Form die haben (ich habe hier mal nur 4 Spalten statt 17, weil's ja nur auf die erste Spalte ankommt):

Code: Alles auswählen

In [181]: ecz = np.zeros((22, 4))

In [182]: ecz
Out[182]: 
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

In [183]: ecz[:,0]
Out[183]: 
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
Und zuweisen kannst Du ``ecz[:,0]`` nur etwas was genau so aussieht [1]_, also ein Array (oder "iterable" allgemein) mit 22 Werten und nicht mit 22 Arrays die jeweils einen Wert enthalten:

Code: Alles auswählen

In [184]: ecz[:,0] = numpy.array(xrange(22))

In [185]: ecz[:,0]
Out[185]: 
array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.])

In [186]: ecz
Out[186]: 
array([[  0.,   0.,   0.,   0.],
       [  1.,   0.,   0.,   0.],
       [  2.,   0.,   0.,   0.],
       [  3.,   0.,   0.,   0.],
       [  4.,   0.,   0.,   0.],
       [  5.,   0.,   0.,   0.],
       [  6.,   0.,   0.,   0.],
       [  7.,   0.,   0.,   0.],
       [  8.,   0.,   0.,   0.],
       [  9.,   0.,   0.,   0.],
       [ 10.,   0.,   0.,   0.],
       [ 11.,   0.,   0.,   0.],
       [ 12.,   0.,   0.,   0.],
       [ 13.,   0.,   0.,   0.],
       [ 14.,   0.,   0.,   0.],
       [ 15.,   0.,   0.,   0.],
       [ 16.,   0.,   0.,   0.],
       [ 17.,   0.,   0.,   0.],
       [ 18.,   0.,   0.,   0.],
       [ 19.,   0.,   0.,   0.],
       [ 20.,   0.,   0.,   0.],
       [ 21.,   0.,   0.,   0.]])
.. [1] Stimmt nicht ganz -- man kann natürlich auch einen Skalar zuweisen.

Edit: `Code Craft -- The Practice Of Writing Excellent Code` von Pete Goodliffe behandelt das schreiben von "gutem Code" im Allgemeinen -- also nicht speziell auf Python bezogen -- und `Expert Python Programming` von Tarek Ziadé enthält auch ein wenig zu dem Thema.
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

also jetzt funktioniert es :mrgreen:

Code: Alles auswählen

    # Erste Spalte mit X-Werten ueber alle Felder korrigiern
    x1 = numpy.linspace(0, l1, 11)
    x2 = numpy.linspace(l1, l2+l1, 11)
    x = numpy.hstack((x1[:11] , x2[:11]))
    ecz[:, 0] = x # : als 1. Argument selektiert alle Zeilen, 0 als zweites wählt die 1. Spalte aus
Vielen Dank
BlackJack hat geschrieben: Und zuweisen kannst Du ``ecz[:,0]`` nur etwas was genau so aussieht [1]_, also ein Array (oder "iterable" allgemein) mit 22 Werten und nicht mit 22 Arrays die jeweils einen Wert enthalten:

.. [1] Stimmt nicht ganz -- man kann natürlich auch einen Skalar zuweisen.
Noch einmal wegen dem besseren Code, gibt es dafür Literatur woran man sich lang hangeln könnte ?

Wie kann man denn so ne tolle In Out Struktur im Forum erstellen? :)
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

``numpy.array(xrange(22))`` lässt sich auch als ``numpy.arange(22)`` schreiben.

@mathman: Zur Literatur sie Blackjacks letzten Beitrag. Das "In" und "Out" kommt von IPython. Sehr zu empfehlen, insbesondere auch für wissenschaftliches Arbeiten mit Python.
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

gkuhl hat geschrieben:``numpy.array(xrange(22))`` lässt sich auch als ``numpy.arange(22)`` schreiben.

@mathman: Zur Literatur sie Blackjacks letzten Beitrag. Das "In" und "Out" kommt von IPython. Sehr zu empfehlen, insbesondere auch für wissenschaftliches Arbeiten mit Python.
Von range hab ich schon einmal in Matlab gehört :)
IPython ist also so was wie Matlab, werde ich mir heute Abend installieren :) Danke :)

Mit der Literatur meinte ich eigentlich wie man einen besseren Syntax schreiben kann (Wo auch Zen berücksichtig wird) ;)

Gruß
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mathman hat geschrieben:IPython ist also so was wie Matlab, werde ich mir heute Abend installieren :) Danke :)
Nein, eigentlich überhaupt nicht.
mathman hat geschrieben:Mit der Literatur meinte ich eigentlich wie man einen besseren Syntax schreiben kann (Wo auch Zen berücksichtig wird) ;)
Man will klareren, kürzeren, konziseren Code schreiben. Mit Syntax hat das erstmal gar nichts zu tun, bis auf das man natürlich die Syntax "seiner" Programmiersprache beherrschen sollte.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Leonidas hat geschrieben:
mathman hat geschrieben:IPython ist also so was wie Matlab, werde ich mir heute Abend installieren :) Danke :)
Nein, eigentlich überhaupt nicht.
Ist also "nur" eine Konsole wo man scipy nutzen kann?
Leonidas hat geschrieben:
mathman hat geschrieben:Mit der Literatur meinte ich eigentlich wie man einen besseren Syntax schreiben kann (Wo auch Zen berücksichtig wird) ;)
Man will klareren, kürzeren, konziseren Code schreiben. Mit Syntax hat das erstmal gar nichts zu tun, bis auf das man natürlich die Syntax "seiner" Programmiersprache beherrschen sollte.
Also ehr ein Entwicklungsprozess?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ja, kommt durch viel Übung und Code von anderen lesen ganz von alleine. Gibt auch kein HOWTO o.ä. an das man sich orientieren kann, um eleganten Code zu schreiben. Du kannst dich ja mal mit "Testability" auseinander setzen. Wenn dein Code gut zu testen ist, dann ist das schon mal eine gute Basis. (Setzt du überhaupt schon Unittests ein? Nicht das Modul, sondern Unittests im Allgemeinen)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mathman hat geschrieben:
Leonidas hat geschrieben:
mathman hat geschrieben:IPython ist also so was wie Matlab, werde ich mir heute Abend installieren :) Danke :)
Nein, eigentlich überhaupt nicht.
Ist also "nur" eine Konsole wo man scipy nutzen kann?
Ja, eine Konsole mit einer Reihe Zusatzfeatures.

mathman hat geschrieben:
Leonidas hat geschrieben:
mathman hat geschrieben:Mit der Literatur meinte ich eigentlich wie man einen besseren Syntax schreiben kann (Wo auch Zen berücksichtig wird) ;)
Man will klareren, kürzeren, konziseren Code schreiben. Mit Syntax hat das erstmal gar nichts zu tun, bis auf das man natürlich die Syntax "seiner" Programmiersprache beherrschen sollte.
Also ehr ein Entwicklungsprozess?
Ja, so kann man es nennen. Dauert, je nach vorhergehender Erfahrung auch immer etwas bis man richtig idiomatischen Code schreibt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

derdon hat geschrieben:Ja, kommt durch viel Übung und Code von anderen lesen ganz von alleine. Gibt auch kein HOWTO o.ä. an das man sich orientieren kann, um eleganten Code zu schreiben. Du kannst dich ja mal mit "Testability" auseinander setzen. Wenn dein Code gut zu testen ist, dann ist das schon mal eine gute Basis. (Setzt du überhaupt schon Unittests ein? Nicht das Modul, sondern Unittests im Allgemeinen)
Was soll das sein ? :K

##Nachtrag
Wenn ich das richtig verstehe, dann meinst du das man die einzelnen Module separat auf Funktion testet.
Jup das hab ich schon gemacht :D
Antworten