我有一个由odeint函数创建的名为X的300 x 4矩阵。在第二列是y值,我想在y值低于0时切割矩阵。作为第一步,我试图创建一个函数,该函数将读取第二列并吐出行号,其中第一列低于0。
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
哪个不起作用,从概念上讲我知道这是错的,我想不出另一种方法来做到这一点。有没有办法删除包含的所有行并遵循第一个&lt; 0 y值?
这是我的全部代码:
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 :(得分:2)
也许你可以使用takewhile
包中的itertools
函数:
from itertools import takewhile
first_elements = list(takewhile(lambda x: x[1] >= 0, X))
X
是你的矩阵。我在x[1]
谓词中使用了lambda
来比较第二列中的数字。
这里,first_elements
将是第一行之前包含小于零的值的矩阵行。您可以使用len(first_elements)
来了解截止点是什么。
我把它转换成了一个列表,但如果你只是想要遍历结果,你就没有了。
我希望这有效。
答案 1 :(得分:0)
你可以这样做:
newVals = []
i = 0
while( i < len(X) and X[i][1] >= 0):
newVals.append(X[i])
i += 1
这将通过X
并将值附加到列表newVals
,直到您到达列表末尾(i < len(X)
)或达到您的条件(X[i][1] >= 0
)。