Wenn Sie negative Beiträge zum integrierten Bereich verwerfen wollen wir einfach greifen können die np.trapz
source 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.
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 ... –
Wenn du "negativ" sagst Bereiche "meinst du" y "Werte kleiner als Null oder negative Beiträge zum Integrationsvolumen? – Daniel
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