Seite 1 von 1
String in ndarray für numpy wandeln
Verfasst: Freitag 10. Februar 2017, 20:36
von nieselfriem
Hallo,
ich möchte ein wenig in QT und numpy was ausprobieren. Dabei habe ich ein QLineEdit in dem eine Funktion stehen soll, z.B. "x**2" und diese soll dann mit matplotlib und numpy als Graph ausgegeben werden. Doch leider scheitert das Thema an dem datentypen für numpy
ich kann für numpy eine Funktion ja wie folgt angeben
Nun liefert aber QLineEdit diese Funktion als String. Wie kann ich diesen String als Datentyp für numpy konvertieren?
vg niesel
Re: String in ndarray für numpy wandeln
Verfasst: Samstag 11. Februar 2017, 09:04
von MagBen
Schau Dir das mal an
Code: Alles auswählen
from PyQt4.QtCore import QString
import numpy as np
import matplotlib.pyplot as plt
lineEditOutput = QString("0.5*x*2-9")
my_function_str = unicode(lineEditOutput)
my_function = eval("lambda x: " + my_function_str)
x = np.linspace(0,5,21)
y = my_function(x)
plt.figure()
plt.plot(x,y)
plt.show()
Re: String in ndarray für numpy wandeln
Verfasst: Samstag 11. Februar 2017, 09:44
von snafu
Hier ist das umfangreiche SymPy-Package ein gutes Bindeglied:
Code: Alles auswählen
import numpy as np
from sympy.abc import x, y
from sympy.parsing.sympy_parser import parse_expr
from sympy.utilities.lambdify import lambdify
def make_func(string, symbols=(x,)):
return lambdify(symbols, parse_expr(string))
def main():
xs = np.linspace(0, 1, 5)
double = make_func('x*2')
print('Original:', xs)
print('Double:', double(xs))
print()
xs = np.linspace(0, 2, 3)
ys = np.linspace(2, 4, 3)
formula = '(x + 1) * (y + 2)'
f = make_func(formula, (x, y))
print('xs:', xs)
print('ys:', ys)
print('Formula:', formula)
print('->', f(xs, ys))
if __name__ == '__main__':
main()
Dies hat gegenüber der Lösung von MagBen den Vorteil, dass nicht beliebiger (Schad-)Code ausgeführt wird. Außerdem ist es flexibler in Bezug auf zusätzliche Symbole. Bringt einem zwar eine zusätzliche Abhängigkeit an, aber das ist bei wissenschaftlichen Anwendungsgebieten ja sowieso üblich.
Re: String in ndarray für numpy wandeln
Verfasst: Samstag 11. Februar 2017, 10:10
von snafu
Die Übergabe der SymPy-Symbole kann man übrigens auch abstrahieren (z.B. damit der Aufrufer sich den SymPy-Import spart):
Code: Alles auswählen
import numpy as np
from sympy import symbols
from sympy.parsing.sympy_parser import parse_expr
from sympy.utilities.lambdify import lambdify
def make_func(string, used_symbols='x'):
return lambdify(symbols(used_symbols), parse_expr(string))
def main():
f = make_func('x*2')
g = make_func('x+y', used_symbols='x, y')
xs = np.linspace(0, 1, 5)
print('x-values:', xs)
ys = np.linspace(2, 3, 5)
print('y-values:', ys)
print('f(x) = x * 2 ->', f(xs))
print('g(x, y) = x + y ->', g(xs, ys))
if __name__ == '__main__':
main()