2012-09-09 7 views
12

Für meine Laborversuche schreibe ich kleine Programme, die bei der Datenanalyse helfen. Normalerweise brauche ich nur einfache Berechnungen, Mittelwerte, Standardabweichung, willkürliche gewichtete Funktionsanpassung und Diagramme mit Fehlerbalken und angepasster Funktion.SciPy statt GNU Octave

Mit GNU Octave kann ich dies tun. Ich fing an, mehr in die Sprache davon zu lesen, und ich beginne, seine Widersprüchlichkeiten nicht zu mögen, und dass ich noch eine andere Sprache lernen muss.

Also denke ich über die Verwendung von Python, die ich seit einiger Zeit verwende, SciPy und NumPy. Kann ich diese Dinge leicht mit Python machen oder ist es mehr Overhead, um die allgemeine Sprache Python dazu zu bringen, das zu tun, was ich vorhabe?

Antwort

20

Ja, das Python-Ökosystem macht es zu einer praktikablen Plattform für alltägliche Datenanalyseaufgaben, insbesondere mit der IPython-Schnittstelle (aber ich bleibe hier beim Standard). Die "muss nicht noch eine andere Sprache lernen" Argument ist eine starke, IMHO, und ist einer der Gründe, warum ich Python für dieses Zeug verwenden.

>>> import numpy as np 
>>> import scipy.optimize 

"Ich in der Regel brauchen nur einfache Berechnungen"

>>> x = np.linspace(0, 10, 50) 
>>> y = 3*x**2+5+2*np.sin(x) 

"bedeutet Standardabweichung"

>>> y.mean() 
106.3687338223809 
>>> y.std() 
91.395548605660522 

"arbitrary gewichtete Funktion fitting"

>>> def func(x, a, b, c): 
...  return a*x**2+b+c*np.sin(x) 
... 
>>> ynoisy = y + np.random.normal(0, 0.2, size=len(x)) 
>>> popt, pcov = scipy.optimize.curve_fit(func, x, ynoisy) 
>>> popt 
array([ 3.00015527, 4.99421236, 2.03380468]) 

„Plots mit Fehlerbalken und angepasstem f Salbung“

xerr = 0.5 
yerr = abs(np.random.normal(0.3, 10.0)) 
fitted_data = func(x, *popt) 

# using the simplified, non-object-oriented interface here 
# handy for quick plots 

from pylab import * 
errorbar(x, ynoisy, xerr=xerr, yerr=yerr, c="green", label="actual data") 
plot(x, fitted_data, c="blue", label="fitted function") 
xlim(0, 10) 
ylim(0, 350) 
legend() 
xlabel("time since post") 
ylabel("coolness of Python") 
savefig("cool.png") 

sample pic

+0

+1: nette Antwort. – tom10

+0

Vielen Dank für die detaillierte Antwort! Das sollte mich ziemlich schnell starten lassen. Ich habe nur eine kleine Sache, die ich vergessen habe zu fragen: Wie man mit den Mess- und Fehler-Tupel vernünftig umgehen kann. (Ich fragte das [dort] (http://stackoverflow.com/q/12351837/653152).) –