Python - 根据行中的值在指定点处剪切数组

时间:2016-05-05 18:35:05

标签: python arrays

我有一个由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

2 个答案:

答案 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 )。

相关问题