2016-05-05 13 views
0

Ich habe eine 300 x 4 Matrix namens X von der Odeint-Funktion erstellt. In der zweiten Spalte sind y-Werte und ich möchte die Matrix abschneiden, wenn der y-Wert unter 0 sinkt. Als ersten Schritt habe ich versucht, eine Funktion zu erstellen, die die zweite Spalte lesen und die Zeilennummer ausspucken würde Säule zuerst taucht unter 0.Python - Ausschneiden eines Arrays an einem bestimmten Punkt basierend auf dem Wert in Zeile

X = odeint(func, X0, t) 

    Yval = X[:,1] 

    def indexer(): 
     i = 0 
     if Yval[i] > 0: 
      i = i + 1 
     if Yval[i] < 0: 
      return i 

Was nicht funktioniert und vom Konzept her weiß ich, das ist falsch, ich konnte einfach nicht glauben, der einen anderen Weg, dies zu tun. Gibt es eine Möglichkeit, alle Zeilen auszuschneiden, die den ersten < 0 y-Wert enthalten und ihm folgen?

Das ist meine gesamte Code:

import numpy as np 
    import math 
    from scipy.integrate import odeint 

    g = 9.8 
    theta = (45 * math.pi)/180 
    v0 = 10.0 
    k = 0.3 

    x0 = 0 
    y0 = 0 
    vx0 = v0*math.sin(theta) 
    vy0 = v0*math.cos(theta) 

    def func(i_state,time): 
     f = np.zeros(4) 
     f[0] = i_state[2] 
     f[1] = i_state[3] 
     f[2] = -k*(f[0]**2 + f[1]**2)**(.5)*f[0] 
     f[3] = -g - k*(f[0]**2 + f[1]**2)**(.5)*f[1] 
     return f 

    X0 = [x0, y0, vx0, vy0] 
    t0 = 0 

    tf = 3 
    timestep = 0.01 

    nsteps = (tf - t0)/timestep 
    t = np.linspace(t0, tf, num = nsteps) 

    X = odeint(func, X0, t) 

    Yval = X[:,1] 

    def indexer(): 
     i = 0 
     if Yval[i] > 0: 
      i = i + 1 
     if Yval[i] < 0: 
      return i 
+0

Können Sie bitte einige Beispieldaten hinzufügen? – reubano

+0

@ reubano - habe meinen gesamten obigen Code hinzugefügt, der das Array/die Matrix erzeugt. Danke – Edna

+0

lassen Sie mich sehen, wenn das ist, was Sie meinen, sagen Sie haben die Daten: (1,1,1,1), (2,2,2,2), (3,3,3,3), (4, -1,4,4), (5,5,5,5) Sie möchten nur (1,1,1,1), (2,2,2,2) , (3,3,3,3) –

Antwort

0

Man könnte so etwas tun:

newVals = [] 
i = 0 
while(i < len(X) and X[i][1] >= 0): 
    newVals.append(X[i]) 
    i += 1 

Das durch X gehen würde und fügen Sie Werte in die Liste newVals, bis Sie entweder bis zum Ende der Liste (i < len(X)) oder Sie erreichen Ihre Bedingung (X[i][1] >= 0) .

+1

Danke - das ist großartig – Edna

2

Vielleicht könnten Sie die takewhile Funktion aus dem itertools Paket verwenden:

from itertools import takewhile 
first_elements = list(takewhile(lambda x: x[1] >= 0, X)) 

Wo X Ihre Matrix ist. Ich habe x[1] im Prädikat lambda verwendet, um die Zahlen in der zweiten Spalte zu vergleichen.

Hier sind first_elements die Zeilen der Matrix vor der ersten Zeile, die einen Wert kleiner als Null enthält. Sie können len(first_elements) verwenden, um zu wissen, was der Cutoff-Punkt war.

Ich konvertierte es in eine Liste, aber Sie müssen nicht, wenn Sie nur durch das Ergebnis durchlaufen werden.

Ich hoffe, das funktioniert.

+0

Danke - das hat super funktioniert. Ich wünschte, ich könnte zwei Antworten auswählen - ich habe nur die folgende ausgewählt, weil sie automatisch die Matrix erstellt – Edna

+0

@Eliza Sie könnten diese Antwort abstimmen. –

Verwandte Themen