2011-01-11 6 views
1

Ich habe ein Array von 10 Zeilen mit 20 Spalten. Jede Spalte entspricht einem Datensatz, der nicht mit irgendeiner Art von kontinuierlicher mathematischer Funktion versehen werden kann (es ist eine Reihe von Zahlen, die experimentell abgeleitet werden). Ich möchte das Integral jeder Spalte zwischen Zeile 4 und Zeile 8 berechnen und dann das erhaltene Ergebnis in einem neuen Array speichern (20 Zeilen x 1 Spalte).Der effizienteste Weg, um ein Integral in einem Datensatzbereich zu berechnen

Ich habe versucht, verschiedene scipy.integrate Module (z. B. Quad, trpz, ...).

Das Problem ist, dass, wie ich verstehe, scipy.integrate auf Funktionen angewendet werden muss, und ich bin mir nicht sicher, wie Sie jede Spalte meines ursprünglichen Arrays in eine Funktion konvertieren. Als eine Alternative dachte ich daran, den Durchschnitt jeder Spalte zwischen Zeile 4 und Zeile 8 zu berechnen, dann diese Zahl mit 4 zu multiplizieren (d. H. 8-4 = 4, das x-Intervall) und dann diese in meine letzte 20x1-Matrix zu speichern. Das Problem ist ... ähm ... dass ich nicht weiß, wie man den Durchschnitt über einen bestimmten Bereich berechnet. Die Frage, die ich stelle, sind:

  1. Welche Methode ist effizienter/unkomplizierter?
  2. Können Integrale über einen Datensatz wie den von mir beschriebenen berechnet werden?
  3. Wie berechne ich den Durchschnitt über eine Reihe von Zeilen?
+0

ich etwas fehle, aber ein integrales ist lediglich die Fläche unter der „Kurve“, so können Sie nur die Werte aufsummieren in jeder Spalte. –

+0

Sie suchen also die Summe, nicht das Integral, oder? –

+0

Das Integral ist die Fläche unter der Kurve, aber das ist gleich dem Mittelwert Ihrer Werte multipliziert mit dem Integrationsfenster. So Integral (f) zwischen a und b = Mittelwert (f) x (b-a) – Annalisa

Antwort

2

der Summe der Einträge 4 bis 8 (einschließlich der beiden Enden) in jeder Spalte zu erhalten, verwenden

a = numpy.arange(200).reshape(10, 20) 
a[4:9].sum(axis=0) 

(Die erste Zeile ist nur ein Beispiel Array mit der gewünschten Form zu erzeugen.)

3

Da Sie nur die Datenpunkte kennen, ist die beste Wahl trapz (die trapezförmige Annäherung an das Integral, basierend auf den Datenpunkten, die Sie kennen) zu verwenden.

Sie möchten wahrscheinlich nicht Ihre Datensätze in Funktionen konvertieren, und mit trapz müssen Sie nicht.

Also, wenn ich das richtig verstehen, wollen Sie so etwas wie dies zu tun:

from numpy import * 

# x-coordinates for data points 
x = array([0, 0.4, 1.6, 1.9, 2, 4, 5, 9, 10]) 

# some random data: 3 whatever data sets (sharing the same x-coordinates) 
y = zeros([len(x), 3]) 
y[:,0] = 123 
y[:,1] = 1 + x 
y[:,2] = cos(x/5.) 
print y 

# compute approximations for integral(dataset, x=0..10) for datasets i=0,1,2 
yi = trapz(y, x[:,newaxis], axis=0) 
# what happens here: x must be an array of the same shape as y 
# newaxis tells numpy to add a new "virtual" axis to x, in effect saying that the 
# x-coordinates are the same for each data set 

# approximations of the integrals based the datasets 
# (here we also know the exact values, so print them too) 
print yi[0], 123*10 
print yi[1], 10 + 10*10/2. 
print yi[2], sin(10./5.)*5. 
Verwandte Themen