Float für np.array konvertieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Hallo zusammen,

ich würde gerne per Eingabe Ansätze berechnen (mit Dezimalzahlen) und gebe dafür die Einwaagen etc ein. sorbitol_conc ist ein Array, da es zeitlich ausgewertet wird. Kann ich diese Eingabe händisch per input lösen oder müsste ich dazu immer direkt in den Code gehen? Ist gegebenenfalls eine Umwandlung der Liste in eine number oder direkt ins float möglich? gebe ich die Konzentration mit np.array([..]) direkt vor entsteht kein Problem..

Code: Alles auswählen

import numpy as np
m_ansatz = float(input("mAnsatz in g:")) #Abfrage in g
sorbitol_conc= float(input("Sorbitol_conc").split())

#sorbitol_array = np.array([sorbitol_conc])   diese umwandlung klappt leider auch nicht

m_gesamt = m_ansatz * sorbitol_conc
#m_gesamt = m_ansatz * sorbitol_array

print(m_gesamt)

TypeError: float() argument must be a string or a number, not 'list'
Danke für eure Hilfe
Sirius3
User
Beiträge: 18219
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du concentration meinst, dann schreibe nicht conc, und was soll das m_ denn bedeuten? Benutze keine Abkürzungen.
Du suchst fromstring:

Code: Alles auswählen

sorbitol_concentration = np.fromstring(input("Sorbitol concentration"), sep=" ")
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Ergänzend, weil wichtig: sorbitol_conc ist in deinem Code kein Array. Listen und Arrays sind in Python unterschiedliche Dinge.
Im Vorschlag von Sirius3 ist sorbitol_concentration ein Array.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Dankeschön :)
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Diese Arrays dann geplottet ergeben zwei sich schneidende Graphen. Deren Schnittpunkte kann ich dann ohne bekannte Funktion nicht bestimmen oder? Für intersection() finde ich keinen passenden import mit google :(
Danke nochmal für eure Hilfe
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Jein. Hier habe ich zu einem ähnlichen Thema etwas geschrieben und auch einen Link gepostet, wo ein gut funktionierende Code dafür zur Verfügung steht.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

@einfachTobi leider ist das interpolieren der Graphen keine Option bei mir, da dies keine wissenschaftliche Vorgehensweise wäre. Ich muss mit den Punkten arbeiten, welche ich einspeise...
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Interpolation ist sehr wohl eine "wissenschaftliche Vorgehensweise". Zumindest wenn man weiß, was das für die Punkte bedeuten kann, das entsprechend berücksichtigt und beschreibt. Oder was bringt dich zur Meinung, dass das nicht so wäre? Dort werden nicht "die Graphen" interpoliert, sondern für den Bereich zwischen zwei Punktepaaren wird linear interpoliert. Eine andere Möglichkeit wäre ein Curvefitting durchzuführen, um eine Funktion zu erhalten. Das ist aber ebenfalls mit einer Ungenauigkeit behaftet, sofern der Zusammenhang nicht trivial ist. Da wäre anhand von Testmessungen zu prüfen, welches Verfahren für dich die besseren Ergebnisse liefert. Zum Curvefitting: https://docs.scipy.org/doc/scipy/refere ... e_fit.html.
Was genau meinst du mit "mit den Punkten arbeiten, die ich einspeise"? Denn das tust du ja bei beiden Varianten.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Danke @einfachTobi, leider löst es nicht mein Problem. Denn nach Rücksprache sind es nicht die Schnittpunkte sondern generell das maximum in einem Array. Leider ist die Berechnung nicht nur immer von dem Maximum im Array abhängig sondern auch von der Zeit, welche ebenfalls über ein Array eingegeben wird.
Somit müsste ich a) erkennen, wie groß das Array ist (gelöst mit if len() == x:) und b) muss er in dieser Länge das Maximum finden und verständlich machen, dass dann für dieses Array die Rechnung mit dem gleichen zeitlichen Array durchgeführt werden soll.
Ist so eine Maxabfrage in Kombi mit der Abhängigkeit des zweiten Arrays möglich?
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Ja, die eigentliche Berechnung ist ein Einzeiler, sofern die Intervallgrenzen schon feststehen:

Code: Alles auswählen

import numpy as np
from matplotlib import pyplot as plt
daten = np.array([0, 1, 2, 3, 4, 0, 1, 2, 2, 2, 3, 0, 1, 2])
zeiten = np.arange(0, 14)
plt.plot(zeiten, daten)
plt.show()
maximum_im_intervall = np.max(daten[np.where((zeiten > 8) & (zeiten < 12))])
maximum_global = np.max(daten)
print(f"Maximum im Intervall: {maximum_im_intervall}")
print(f"Maximum global: {maximum_global}")
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Ich habe meins so gelöst :)
mir reichte das.

Code: Alles auswählen

if len(t) == 4:
    if np.min(ausbeute_sorbitol) == ausbeute_sorbitol[1]:
        k_sorbitol = ausbeute_sorbitol[0] - ausbeute_sorbitol[1]
    elif np.min(ausbeute_sorbitol) == ausbeute_sorbitol[2]:
        k_sorbitol = ausbeute_sorbitol[0] - ausbeute_sorbitol[2]
    elif np.min(ausbeute_sorbitol) == ausbeute_sorbitol[3]:
        k_sorbitol = ausbeute_sorbitol[0] - ausbeute_sorbitol[3]
else: k_sorbitol = (ausbeute_sorbitol[0] - ausbeute_sorbitol[1])
leider ist mir direkt am Anfang mit dem Eingeben der floats und der Rechnung der Fehler unterlaufen, dass die händische Eingabe der Arrays entweder berechnet werden muss per Hand oder ich eine zu große Konzentration errechne, was mir dann hier unten den mathematischen Fehler von 112% ausgibt.
Funktioniert ohne float so:

Code: Alles auswählen

m_sorbitol = 2000#Abfrage in mg
m_ansatz = 22.4#Abfrage in g
start_sorbitol = m_sorbitol / m_ansatz
sorbitol_conc = np.array([start_sorbitol, 39.562, 3.525, 0.232])
Mit float, kann ich die Konzentration so nicht errechnen lassen, da ich händisch nochmal eine Zahl eingeben muss, diese müsster ich dann dort direkt eingeben.

Ich müsste mit start_sorbitol nur np.array[0] füllen und den Rest also [1] - [3] eigeben können..
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Ich verstehe kein Wort. Was hat das mit einem float zu tun? Ich vermute, dass du etwas anderes meinst, als du sagst. Ich kann aber auch nicht nachvollziehen, was gemeint sein könnte. Du kannst doch ein Eingaben vom Nutzer holen was du willst und diese auch verwenden wie du willst. Machst du ja oben mit `m_ansatz` auch. Mir scheint das weiterhin ganz "strubbelig" was du da machst - aber vielleicht kannst du Licht ins Dunkle bringen :)
Wenn du weitere Unterstützung oder Tipps haben möchtest, mach bitte folgendes:
Beschreibe zunächst dein aktuelles Vorhaben. Was (thematisch) sind die Problemstellung und das Ziel? Dann: Was sind programmiertechnisch die Problemstellung und das Ziel? An welchen Stellen macht dein Code was und was würdest du stattdessen erwarten, dass er macht? Poste dazu auch den vollständigen Code und falls eine Fehlermeldung auftritt auch diese.
Sirius3
User
Beiträge: 18219
Registriert: Sonntag 21. Oktober 2012, 17:20

In diesem Code

Code: Alles auswählen

if len(t) == 4:
    if np.min(ausbeute_sorbitol) == ausbeute_sorbitol[1]:
        k_sorbitol = ausbeute_sorbitol[0] - ausbeute_sorbitol[1]
    elif np.min(ausbeute_sorbitol) == ausbeute_sorbitol[2]:
        k_sorbitol = ausbeute_sorbitol[0] - ausbeute_sorbitol[2]
    elif np.min(ausbeute_sorbitol) == ausbeute_sorbitol[3]:
        k_sorbitol = ausbeute_sorbitol[0] - ausbeute_sorbitol[3]
else: k_sorbitol = (ausbeute_sorbitol[0] - ausbeute_sorbitol[1])
Steht doch in jeder Zeile das selbe:

Code: Alles auswählen

k_sorbitol = ausbeute_sorbitol[0] - np.min(ausbeute_sorbitol) 
Und im ausgehoben Beitrag hatte ich ja schon geschrieben: benutze keine Abkürzungen. Was soll das k_ oder m_ bedeuten? Schreib es aus, dann ist der Code viel leichter lesbar.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

@einfachtobi hier der Code.
Es soll ein Ansatz per Eingaben berechnet, geplottet und weiterverarbeitet werden. (Excel wäre möglich, Vorgabe ist Python und ich sehe die Automation besser gegeben.
Zuerst soll das Programm starten und die Einwaagen, Zeitpunkte der Proben und die Messwerte eingegeben werden (das funktioniert erstmal).
Dann soll daraus eine Ausbeute berechnet werden und diese graphisch gegen die Zeit aufgetragen werden.

Hier der erste Haken, die Berechnung für t = 0 mit der Sorbitolkonzentration führe ich nicht händisch durch. Bislang habe ich dort immer eine 100 eingegeben + die 3 Messwerte. Dies führt zum Zeitpunkt t = 0 zu Ausbeuten von 112% für Sorbitol, was nicht möglich ist ;)
Daher suche ich nach einem Weg, wie ich das erste Feld im Array für sorbitol_conc durch die davor gewählten eingaben errechnen kann und anschließend die 3 fehlenden Felder (sorbitol_conc[1],[2],[3]) per Hand eintage.
Sollte dies funktionieren, soll das Programm dann den Grafen plotten, speichern, eine Datei mit den Ausbeuten ausgeben und die weiteren Faktoren berechnen.
Idealerweise werden die berechneten Faktoren/Konstanten dann nochmal in eine neue Datei gespeichert, welche jedesmal um den nächsten Faktor (beim nächsten Prgrammdurchlauf) erweitert wird. So könnte ein zweites Programm die Datei öffnen und ebenfalls plotten.

Das würde die gesamte Auswertung auf zweimal "ausführen" und einmal Eingabe der bekannten Werte reduzieren.

Möchte hinzufügen, dass ich gesamt Python seit etwa 3 Wochen angehe, also noch absoluter Anfänger bin.

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

#Eingabe der Einwaagen, Zeitpunkte der Proben und Messdaten der Proben


t = np.fromstring(input("Zeitpunkt der Probenname in h:"), sep=" ")

m_sorbitol = float(input("Einwaage Sorbitol in g:")) * 1000 #Abfrage in g
m_ansatz = float(input("Einwaage gesamt in g:")) #Abfrage in g
#start_sorbitol = m_sorbitol / m_ansatz
sorbitol_conc = np.fromstring(input("Sorbitol Koncentration aus der HPLC Leerzeichen getrennt"), sep=" ")
#isosorbid_conc = np.fromstring(input("Isosorbid Koncentration aus der HPLC Leerzeichen getrennt"), sep=" ")
nebenprodukt_conc = np.fromstring(input("2,5-AHS + 1,4-AHS Koncentration aus der HPLC Leerzeichen getrennt"), sep=" ")
#pg_conc = np.fromstring(input("PG Koncentration aus der HPLC Leerzeichen getrennt"), sep=" ")
sorbitol_conc = np.array([100, 23.74])
isosorbid_conc = np.array([0, 51.2])
#eg_conc = np.array([0, 0.12])
#pg_conc = np.array([0, 0.5])

#Berechnung sämtlicher Hintergründe

mw_sorbitol = 182.17
n_sorbitol = m_sorbitol / mw_sorbitol

mw_isosorbid = 146.14
m_isosorbid_soll = mw_isosorbid * n_sorbitol

mw_nebenprodukt = 164.16
m_nebenprodukt_soll = n_sorbitol * mw_nebenprodukt

#mw_pg = 76.09
#m_pg_soll = n_sorbitol * mw_pg

m_gesamt_sorbitol = m_ansatz * sorbitol_conc
m_gesamt_isosorbid = m_ansatz * isosorbid_conc
m_gesamt_nebenprodukt = m_ansatz * nebenprodukt_conc
#m_gesamt_pg = m_ansatz * pg_conc

ausbeute_sorbitol = m_gesamt_sorbitol / m_sorbitol * 100                 #<----- Diese darf zum Array[0] nicht >100% liegen, kommt sie aktuell leider
ausbeute_isosorbid = m_gesamt_isosorbid / m_isosorbid_soll * 100
ausbeute_nebenprodukt = m_gesamt_nebenprodukt / m_nebenprodukt_soll * 100
#ausbeute_pg = m_gesamt_pg / m_pg_soll * 100

#Plotten der Grafik

plt.plot(t, ausbeute_isosorbid, label ="Isosorbid")
plt.plot(t, ausbeute_sorbitol, label ="Sorbitol")
plt.plot(t, ausbeute_nebenprodukt, label="1,4-AHS + 2,5-AHS")
#plt.plot(t, ausbeute_pg, label="Propylenglykol")
titel = input("Diagramm- und Dateinamen eingeben:")
plt.title(titel)
plt.ylabel("Ausbeute in %")
plt.xlabel("Zeit in [h]")
plt.legend(loc = "best")
plt.savefig(titel)

#Überprüfung für mich

print(ausbeute_isosorbid, ausbeute_sorbitol, ausbeute_nebenprodukt) #ausbeute_pg)
file = np.array(["Isosorbid", ausbeute_isosorbid, "Sorbitol",ausbeute_sorbitol, "2,5-AHS + 1,4-AHS", ausbeute_nebenprodukt]) #   "PG", ausbeute_pg])

#auswerfen einer txt-Datei

with open(titel, "w") as output:
     output.write(str(file))
     
#Berechnung von k, welche anschließend in einer Datei idealerweise gespeichert werden soll, damit ein zweites Programm die Datei zu einer Grafik plotten kann (es sollen verschiedene k-Werte dort hinein geschrieben werden)  
     
if len(t) == 4:
    if np.max(ausbeute_isosorbid) == ausbeute_isosorbid[1]:
        k_isosorbid_1 = ausbeute_isosorbid[1] - ausbeute_isosorbid[0]
    elif np.max(ausbeute_isosorbid) == ausbeute_isosorbid[2]:
        k_isosorbid_1 = ausbeute_isosorbid[2] - ausbeute_isosorbid[0]
    elif np.max(ausbeute_isosorbid) == ausbeute_isosorbid[3]:
        k_isosorbid_1 = ausbeute_isosorbid[3] - ausbeute_isosorbid[0]
else: k_isosorbid_1 = (ausbeute_isosorbid[1] - ausbeute_isosorbid[0])

print("maximale Ausbeute Isosorbid", k_isosorbid_1, "%")

if len(t) == 4:
    if np.max(ausbeute_isosorbid) == ausbeute_isosorbid[1]:
        k_zeit = (t[1] - t[0]) * 3600
    elif np.max(ausbeute_isosorbid) == ausbeute_isosorbid[2]:
        k_zeit = (t[2] - t[0]) * 3600
    elif np.max(ausbeute_isosorbid) == ausbeute_isosorbid[3]:
        k_zeit = (t[3] - t[0]) * 3600
else: k_zeit = (t[1] - t[0]) * 3600
    
print("Maximale Ausbeute erreicht nach", k_zeit, "Sekunden")

k_isosorbid_konstante = k_isosorbid_1 / k_zeit

print("Geschwindigkeitskonstante k(Isosorbid)", k_isosorbid_konstante)

if len(t) == 4:
    if np.min(ausbeute_sorbitol) == ausbeute_sorbitol[1]:
        k_sorbitol = ausbeute_sorbitol[0] - ausbeute_sorbitol[1]
    elif np.min(ausbeute_sorbitol) == ausbeute_sorbitol[2]:
        k_sorbitol = ausbeute_sorbitol[0] - ausbeute_sorbitol[2]
    elif np.min(ausbeute_sorbitol) == ausbeute_sorbitol[3]:
        k_sorbitol = ausbeute_sorbitol[0] - ausbeute_sorbitol[3]
else: k_sorbitol = (ausbeute_sorbitol[0] - ausbeute_sorbitol[1])

print("maximale Ausbeute Sorbitol", k_sorbitol, "%")

if len(t) == 4:
    if np.min(ausbeute_sorbitol) == ausbeute_sorbitol[1]:
        k_zeit = (t[1] - t[0]) * 3600
    elif np.min(ausbeute_sorbitol) == ausbeute_sorbitol[2]:
        k_zeit = (t[2] - t[0]) * 3600
    elif np.min(ausbeute_sorbitol) == ausbeute_sorbitol[3]:
        k_zeit = (t[3] - t[0]) * 3600
else: k_zeit = (t[1] - t[0]) * 3600
    
print("Maximale Ausbeute erreicht nach", k_zeit, "Sekunden")

k_sorbitol_konstante = k_sorbitol / k_zeit

print("Geschwindigkeitskonstante k(Sorbitol)", -k_sorbitol_konstante)
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Hallo,
ich habe mir mein Eingabeproblem so gelöst:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

t = np.fromstring(input("Zeitpunkt der Probenname in h:"), sep=" ")

m_sorbitol = float(input("Einwaage Sorbitol in g:")) * 1000 #Abfrage in g
m_ansatz = float(input("Einwaage gesamt in g:")) #Abfrage in g
start_sorbitol = np.array([m_sorbitol / m_ansatz])
start_isosorbid = np.array([0])
start_nebenprodukt = np.array([0])
sorbitol_conc_eingabe = np.fromstring(input("Sorbitol Koncentration aus der HPLC Leerzeichen getrennt"), sep=" ")
sorbitol_conc = np.concatenate((start_sorbitol, sorbitol_conc_eingabe))
isosorbid_conc_eingabe = np.fromstring(input("Isosorbid Koncentration aus der HPLC Leerzeichen getrennt"), sep=" ")
isosorbid_conc = np.concatenate((start_isosorbid, isosorbid_conc_eingabe))
nebenprodukt_conc_eingabe = np.fromstring(input("2,5-AHS + 1,4-AHS Koncentration aus der HPLC Leerzeichen getrennt"), sep=" ")
nebenprodukt_conc = np.concatenate((start_nebenprodukt, nebenprodukt_conc_eingabe))
Die weitere Auswertung, also speichern in Dateien etc, werde ich dann jetzt angehen :D
Sirius3
User
Beiträge: 18219
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt verstehe ich endlich, was Du eigentlich erreichen wolltest:

Code: Alles auswählen

import numpy as np

zeitpunkte = np.fromstring(input("Zeitpunkt der Probenname in h:"), sep=" ")
m_sorbitol = float(input("Einwaage Sorbitol in g:")) * 1000
m_ansatz = float(input("Einwaage gesamt in g:"))
sorbitol_concentration = np.fromstring("0 " + input("Sorbitol Konzentration aus der HPLC Leerzeichen getrennt"), sep=" ")
isosorbid_concentration = np.fromstring("0 " + input("Isosorbid Konzentration aus der HPLC Leerzeichen getrennt"), sep=" ")
nebenprodukt_concentration = np.fromstring("0 " + input("2,5-AHS + 1,4-AHS Konzentration aus der HPLC Leerzeichen getrennt"), sep=" ")
sorbitol_concentration[0] = m_sorbitol / m_ansatz
Wie das mit dem min und max besser geht, hatte ich Dir ja schon gezeigt.
Es ist nicht sinnvoll, alles in ein numpy-array zu stecken.
Die Stringrepräsentation sollte dann auch nicht in eine Datei geschrieben werden, denn das Einlesen ist nur unnötig kompliziert. Benutze z.B. json für eine einfache Serialisierung.
Die m_, mw_ oder k_-Präfixe sind für mich auch nur kryptische Buchstaben. Um den Code zu verstehn, benutze keine Abkürzungen.

Wenn Du viele zusammenhängende Daten hast, wäre vielleicht auch Pandas nützlich.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Die Daten einlesen läuft aktuell erstmal nur per Handeingabe, da es so keine großen Dateien gibt, wenn nur von jeder Messung einzeln.
Bin aber egal, ob Python oder Json oder sonstiges eben komplett neu dabei.

Da es für meine Zwecke so erstmal reicht, werde ich als nächsten Schritt versuchen, die Datei mit den Konstanten (k_) zu implementieren und danach wahrscheinlich ein weiteres Script, welches diese dann auswertet und ebenfalls grafisch darstellt bzw. weitere Rechnungen durchführt.
Daher werde ich wahrscheinlich weiter mit Fragen hier im Forum irgendwo auftauchen :D oder hier im Thread.
Antworten