Addition von Single Arrays

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.
Hanso
User
Beiträge: 7
Registriert: Mittwoch 15. Februar 2017, 10:48

Addition von Single Arrays

Beitragvon Hanso » Mittwoch 15. Februar 2017, 11:28

Hallo Leute,

ich habe erst vor kurzer Zeit angefangen mich mit Python zu beschäftigen. Ich glaube mein Problem ist relativ simpel, allerdings konnte ich weder durch googeln, Forum-Suche oder im Manual eine Antwort finden, die bei mir funktioniert hat.

Mein Python-Skript liest aus einer FE-Simulation die Verschiebung (U2) an zwei Knoten (VO und VU) zu jedem Zeitschritt aus. Ich möchte nun die Differenz dieser beiden Verschiebungen für jeden Zeitschritt in Python bestimmen, und als "Verschiebung" als npy-file abspeichern.
Der entsprechende Code (ohne Subtraktion) sieht wie folgt aus:

  1.  
  2. U2 = []
  3. for i in range(1,anz_frames+1):
  4.     UValues = odb.steps['Step-1'].frames[i].fieldOutputs['U'].getSubset(region=odb.rootAssembly.nodeSets['VO']).values 
  5.    
  6.     for k in UValues:
  7.         U2.append([k.dataDouble[1]])
  8. numpy.save('VerschiebungO.npy',U2)
  9.  
  10.  
  11. U2 = []
  12. for i in range(1,anz_frames+1):
  13.     UValues = odb.steps['Step-1'].frames[i].fieldOutputs['U'].getSubset(region=odb.rootAssembly.nodeSets['VU']).values 
  14.    
  15.     for k in UValues:
  16.         U2.append([k.dataDouble[1]])
  17. numpy.save('VerschiebungU.npy',U2)
  18.  


Den Abschnitt mit der Subtraktion habe ich mit verschiedenen Möglichkeiten versucht, z.B.
  1. Verschiebung = VerschiebungO - VerschiebungU
  2. numpy.save('Verschiebung,U2)


oder

  1. np.subtract(VerschiebungO, VerschiebungU)
  2. numpy.save('Verschiebung,U2)


Ich habe zahlreiche Kombinationen und Befehle ausprobiert, leider ohne Erfolg. Kann mir bitte jemand weiterhelfen, mit welchem Befehl es am besten klappen müsste?
Vielen Dank im Vorraus für jegliche Hilfe.
Zuletzt geändert von BlackJack am Mittwoch 15. Februar 2017, 12:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
BlackJack
Moderator
Beiträge: 31356
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Addition von Single Arrays

Beitragvon BlackJack » Mittwoch 15. Februar 2017, 12:34

@Hanso: Wie sind denn `VerschiebungO` und `VerschiebungU` definiert? Welche Fehlermeldung bekommst Du? Das man Listen nicht voneinander abziehen kann? Das sollte eigentlich nicht weiter verwundern.

Du könntest aus den Listen Numpy-Arrays erstellen. *Die* kann man dann voneinander abziehen.

Warum hängst Du an die Listen *Listen* mit nur *einem* Element an? Falls es da um die Dimensionen geht, also (n,1) statt (n,) mit `n` der Anzahl der Werte, dann sollte man das nach dem erzeugen eines Numpy-Arrays mit `reshape()` erledigen. Da sich dabei an den eigentlichen Daten nichts ändert ist das wesentlich effizienter als für jeden Wert nich eine extra Python-Liste mit eben nur diesem einen Wert als einzigem Element zu erzeugen.

Da steht im Grunde zweimal fast der gleiche Code hintereinander. Das sollte man in eine Funktion auslagern um diesen Code nur einmal schreiben zu müssen.
“A lesson I've learned over and over is that computer programs live far longer than you expect. It pays to do 'em better at the beginning, 'cause you're likely to live with them quite a while.” — Cameron Laird in c.l.p
Hanso
User
Beiträge: 7
Registriert: Mittwoch 15. Februar 2017, 10:48

Re: Addition von Single Arrays

Beitragvon Hanso » Mittwoch 15. Februar 2017, 13:43

Danke erstmal für die Antwort.
Das der Code für 2 Listen unnötig lang ist, ist richtig. Ich habe ein Python-Skript vorgegeben und muss es nur abändern, dabei ist es zunächst egal wie kompliziert das ist, und auf diese Weise war es für mich als Neuling am einfachsten zu verstehen.

VerschiebungO und VerschiebungU waren gar nicht definiert, das waren lediglich die Namen der npy-Ausgabedateien. Ich habe jetzt die Definitionen "UValues" und "OValues" erstellt und versucht, das ganze in Arrays umzuwandeln und diese zu subtrahieren.
Mein neuer Code lautet:
  1. U2 = []
  2. for i in range(1,anz_frames+1):
  3.     OValues = odb.steps['Step-1'].frames[i].fieldOutputs['U'].getSubset(region=odb.rootAssembly.nodeSets['VO']).values 
  4.    
  5.     for k in OValues:
  6.         U2.append([k.dataDouble[1]])
  7. numpy.save('VerschiebungO.npy',U2)
  8.  
  9.  
  10. U2 = []
  11. for i in range(1,anz_frames+1):
  12.     UValues = odb.steps['Step-1'].frames[i].fieldOutputs['U'].getSubset(region=odb.rootAssembly.nodeSets['VU']).values 
  13.    
  14.     for k in UValues:
  15.         U2.append([k.dataDouble[1]])
  16. numpy.save('VerschiebungU.npy',U2)
  17.  
  18. from numpy import array
  19. a = np.array([OValues])
  20. b = np.array([UValues])
  21. Verschiebung = a - b
  22. numpy.save('Verschiebung.npy',U2)


Leider bekomme ich dabei die Fehlermeldung "Name error: Name 'np' is not defined". Wenn ich anstatt np.array nur Array schreibe, stürzt sogar das Programm ab. Was mache ich bei der Umwandlung falsch?
Zuletzt geändert von BlackJack am Mittwoch 15. Februar 2017, 14:23, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
MagBen
User
Beiträge: 671
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Re: Addition von Single Arrays

Beitragvon MagBen » Mittwoch 15. Februar 2017, 13:51

Hanso hat geschrieben:Leider bekomme ich dabei die Fehlermeldung "Name error: Name 'np' is not defined".

Anstatt
  1. from numpy import array
  2. ...
  3. numpy.save('Verschiebung.npy',U2)

schreib lieber
  1. import numpy as np
  2. ...
  3. np.save('Verschiebung.npy',U2)
a fool with a tool is still a fool, www.magben.de, YouTube
Hanso
User
Beiträge: 7
Registriert: Mittwoch 15. Februar 2017, 10:48

Re: Addition von Single Arrays

Beitragvon Hanso » Mittwoch 15. Februar 2017, 14:10

Danke ich habe das geändert. Allerdings stürzt das Programm (Abaqus CAE) beim Durchlaufen des Programms ab, irgendwas stimmt wohl noch nicht
Hanso
User
Beiträge: 7
Registriert: Mittwoch 15. Februar 2017, 10:48

Re: Addition von Single Arrays

Beitragvon Hanso » Donnerstag 16. Februar 2017, 14:16

Ich hab noch weitere Möglichkeiten versucht, aber leider funktioniert nichts davon.

  1. from operator import add
  2. map(add, OValues, UValues)
  3. numpy.save('Verschiebung.npy',U2)


oder

  1.  
  2. U2 = []
  3. for i in range(1,anz_frames+1):
  4.     OValues = odb.steps['Step-1'].frames[i].fieldOutputs['U'].getSubset(region=odb.rootAssembly.nodeSets['VO']).values 
  5.    
  6.     for k in OValues:
  7.         U2.append([k.dataDouble[1]])
  8. numpy.save('VerschiebungO.npy',U2)
  9.  
  10.  
  11. U2 = []
  12. for i in range(1,anz_frames+1):
  13.     UValues = odb.steps['Step-1'].frames[i].fieldOutputs['U'].getSubset(region=odb.rootAssembly.nodeSets['VU']).values 
  14.    
  15.     for k in UValues:
  16.         U2.append([k.dataDouble[1]])
  17. numpy.save('VerschiebungU.npy',U2)
  18.  
  19. import numpy as np
  20. vector1 = np.array([OValues])
  21. vector2 = np.array([UValues])
  22. sum_vector = vector1 + vector2
  23. numpy.save('Verschiebung.npy',U2)
  24.  


Egal wie ich es mache, wenn ich das Script laufen lasse, beendet sich das Programm von selbst und nichts passiert.

Brauche ich noch irgendwelche AddOns / Module für Python um np.array zu verwenden?
Kann es daran liegen dass die Listen nicht korrekt als "OValues" "UValues" definiert sind?

Vielen Dank im vorraus für eine Antwort
Zuletzt geändert von BlackJack am Donnerstag 16. Februar 2017, 14:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
MagBen
User
Beiträge: 671
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Re: Addition von Single Arrays

Beitragvon MagBen » Donnerstag 16. Februar 2017, 16:17

Hanso hat geschrieben:Egal wie ich es mache, wenn ich das Script laufen lasse, beendet sich das Programm von selbst und nichts passiert.

Wenn ein Python-Programm abstürzt, dann wird auf der Konsole eine nützliche Fehlermeldung ausgegeben: es wird die Programmzeile und die Art des Fehlers ausgegeben. Anhand dieser Fehlermeldung kann der Spezialist oftmals sagen was Falsch gelaufen ist. Hast Du so eine Fehlermeldung bekommen, die Du hier posten könntest?
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
snafu
User
Beiträge: 4973
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: Addition von Single Arrays

Beitragvon snafu » Donnerstag 16. Februar 2017, 16:46

In welcher Umgebung lässt du das Skript laufen? Es ist bei unerwarteten Abstürzen meistens eine gute Idee, das Skript direkt auf der Kommandozeile aufzurufen. Dann kriegt man auch die Fehlermeldung zu sehen.
shcol (Repo | Doc | PyPi)
Hanso
User
Beiträge: 7
Registriert: Mittwoch 15. Februar 2017, 10:48

Re: Addition von Single Arrays

Beitragvon Hanso » Donnerstag 16. Februar 2017, 17:43

Ich lasse das Programm in Abaqus/CAE laufen. Wenn ich in Python direkt auf "Run" gehe, wähle ich ebenfalls meine Abaqus odb-Datei und muss das Script von dort starten. Welche Alternative gibt es?

Ich muss allerdings sagen dass das Programm lief, bevor ich den neuen Teil mit der Addition hinzugefügt habe. Auch jetzt läuft das Script einige Sekunden, gibt mir Daten aus - bis zu der Stelle mit der Addition. Abaqus gibt die Meldung "GUI detected error while waiting for ipc Connection to close. Abaqus/CAE Kernel exited with an error." aus.


Ist meine Definition mit "OValues" und "UValues" in Ordnung? Oder gibt es eine kompliziertere, aber sichere Methode für die Addition?
Benutzeravatar
BlackJack
Moderator
Beiträge: 31356
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Addition von Single Arrays

Beitragvon BlackJack » Donnerstag 16. Februar 2017, 17:51

@Hanso: Also Numpy-Arrays kannst Du aus den beiden Objekten nicht (sinnvoll) erstellen, denn die liefern soweit man das am Quelltext sehen kann keine Zahlen sondern irgendwelche Objekte von denen man die Zahlen abfragt.
“A lesson I've learned over and over is that computer programs live far longer than you expect. It pays to do 'em better at the beginning, 'cause you're likely to live with them quite a while.” — Cameron Laird in c.l.p
Sirius3
User
Beiträge: 5389
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Addition von Single Arrays

Beitragvon Sirius3 » Donnerstag 16. Februar 2017, 18:18

@Hanso: das was Du da machst, ist wildes Herumraten, ohne Konzept. map liefert eine Liste, die Du aber gleich verwirfst. Außerdem versucht Du irgendwelche Values-Objekte zu addieren, von denen ich bisher nur weiß, dass sie ein dataDouble-Attribut haben. Wie ein +-Operator auf diesen Objekten definiert ist, weiß ich nicht. Was Du statt dessen willst, ist die U2-Listen in numpy-Arrays zu verwandeln und mit diesen zu rechnen.
Benutzeravatar
snafu
User
Beiträge: 4973
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: Addition von Single Arrays

Beitragvon snafu » Donnerstag 16. Februar 2017, 18:39

Du musst vermutlich deine Objekte noch umwandeln. In etwa so:
  1. import numpy as np
  2.  
  3. vec1 = np.array([float(val) for val in OValues])
  4. vec2 = np.array([float(val) for val in UValues])
  5. print(vec1 + vec2)

float() muss möglicherweise durch eine geeignete Methode auf deinen Values ersetzt werden. Denn wie man an den Wert kommen könnte, hast du ja bisher nicht erwähnt und ich habe ehrlich gesagt gerade keine Lust, mich in die Schnittstelle des von dir verwendeten Packages einzuarbeiten.
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 4973
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: Addition von Single Arrays

Beitragvon snafu » Donnerstag 16. Februar 2017, 18:50

Oder direkt ohne NumPy:
  1. zipped = zip(map(float, OValues), map(float, UValues))
  2. print([o + u for o, u in zipped])


Oder die Variante ohne map(), was weniger umständlich ist, falls eine Methode bei den Value-Objekten aufgerufen werden muss:
  1. print([float(o) + float(u) for o, u in zip(OValues, UValues)])
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 4973
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: Addition von Single Arrays

Beitragvon snafu » Donnerstag 16. Februar 2017, 18:57

Hanso hat geschrieben:Ich muss allerdings sagen dass das Programm lief, bevor ich den neuen Teil mit der Addition hinzugefügt habe. Auch jetzt läuft das Script einige Sekunden, gibt mir Daten aus - bis zu der Stelle mit der Addition. Abaqus gibt die Meldung "GUI detected error while waiting for ipc Connection to close. Abaqus/CAE Kernel exited with an error." aus.

Da sollte es doch wohl irgendwo ein Logfile geben oder eine Einstellung, dass man die tatsächliche Fehlermeldung sehen kann. Einfach mal recherchieren. Ohne vernünftige Fehleranzeigen ist so eine Umgebung zum Programmieren IMHO völlig unbrauchbar.
shcol (Repo | Doc | PyPi)
Sirius3
User
Beiträge: 5389
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Addition von Single Arrays

Beitragvon Sirius3 » Donnerstag 16. Februar 2017, 19:12

@snafu: sollte OValues tatsächlich ein Iterable mit Element sein, die in floats umgewandelt werden können, kann numpy daraus direkt ein Array machen:
  1. import numpy as np
  2. vec1 = np.array(OValues, dtype=float)
  3. vec2 = np.array(UValues, dtype=float)
  4. print(vec1 + vec2)

Zurück zu „Allgemeine Fragen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder