找到增加函数的最后一个负值的索引

时间:2018-01-25 12:38:30

标签: python numpy optimization scipy

我有一些增加的函数和一系列值,我想找到这个函数仍为负数的最后一个索引,作为我们的最小工作示例:

def f(x):
    return x-7
x_range = np.linspace(-10,10,num=1000)
n = next(n for n, x in enumerate(x_range) if f(x) < 0) - 1

这是有效的,对于这个例子将是一个很好的解决方案。但是:对于我的例子,评估函数f的计算时间更像是1分钟,因此这样做非常麻烦。此外,我已经猜测值n应该在哪里。我可以编写自己的程序,通过模拟一些查找函数根的算法来寻找值,但我想知道是否有一些简单的内置方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用标准库中的bisect(不是scipy)。你只需要欺骗它就相信它正在处理数组。

>>> import numpy as np
>>> import bisect
>>> 
>>> class fake_array:
...     def __init__(self, f, rng):
...         self.f, self.rng = f, rng
...     def __getitem__(self, x):
...         return self.f(self.rng[x])
...     def __len__(self):
...         return len(self.rng)
... 
>>> def f(x):
...     return x-7
... 
>>> x_range = np.linspace(-10,10,num=1000)
>>>
>>> bisect.bisect_left(fake_array(f, x_range), 0) - 1
849

您还可以限制为子范围:

>>> bisect.bisect_left(fake_array(f, x_range), 0, 800, 900) - 1
849