2013-10-28 3 views
6

Ich mag folgendes Integral mit numpys berechnen können trapzIntegration in numpy Array mit positivem Bereich nur

numpy.trapz([-1, 1]) # returns 0 

funktionieren Aber ich will nicht negative Bereiche ermöglichen. Gibt es eine effiziente Möglichkeit dies zu tun, oder muss ich nach dem minimalen Punkt suchen und das Array von Hand transformieren?

Macht numpy.trapz(numpy.abs([-1, 1])) Sinn?

+0

ja, 'np.trapz (np.abs ([- 1, 1]))' macht Sinn, aber der Integralwert wird in diesem Fall der doppelte Wert des positiven Bereichs sein, also musst du ihn durch das richtige Verhältnis teilen, was in diesem Fall "2" ist ... –

+0

Wenn du "negativ" sagst Bereiche "meinst du" y "Werte kleiner als Null oder negative Beiträge zum Integrationsvolumen? – Daniel

+0

Ich möchte einen Bereich des Graphen haben, der unabhängig vom Koordinatensystem ist, in dem er sich befindet. Ich weiß, dass dies bei nicht geschlossenen Flächen nicht möglich ist. Ich denke, die Bauchmuskeln machen den Trick. @SaulloCastro Wie kompensieren Sie das Verhältnis im allgemeinen Fall? – anopheles

Antwort

2

Wenn Sie negative Beiträge zum integrierten Bereich verwerfen wollen wir einfach greifen können die np.trapzsource code und schreiben sie:

def abstrapz(y, x=None, dx=1.0): 
    y = np.asanyarray(y) 
    if x is None: 
     d = dx 
    else: 
     x = np.asanyarray(x) 
     d = np.diff(x) 
    ret = (d * (y[1:] +y[:-1])/2.0) 
    return ret[ret>0].sum() #The important line 

Ein schneller Test:

np.trapz([-1,0,1]) 
0.0 

abstrapz([-1,0,1]) 
0.5 

Wenn Sie wollen nur vermeiden Bereiche, in denen y ist kleiner als Null einfach Mask 'y' Werte kleiner als Null bis Null:

arr = np.array([-2,-1,0.5,1,2,1,0,5,3,0]) 
np.trapz(arr) 
10.5 

arr[arr<0] = 0 
np.trapz(arr) 
12.5 

Dies ist nicht der beste Weg, aber es ist eine gute Annäherung. Wenn Sie das meinen, kann ich das aktualisieren.

Ich musste Ihr Beispiel leicht ändern, da trapz([-1,1]) per Definition immer 0 zurückgibt. Wir entfernen einige Funktionen auf diese Weise, wenn Sie dies auf mehrdimensionalen Arrays tun müssen, ist es einfach, es wieder hinzuzufügen.

+0

Mit ret [ret> 0] verwerfen Sie nicht einfach jeden negativen Beitrag? Ich möchte einen Bereich im traditionellen Sinn haben, d. H. Jeden Teilbereich positiv behandeln. In Ihrem Beispiel hat ein Array mit nur negativen Werten eine Nullfläche. Das ist nicht was ich will. – anopheles