在numpy中找到布尔条件的端点是否有比线性更快的方法?

时间:2012-03-05 18:17:22

标签: numpy scipy

是否有人知道(常见情况)快于线性的方法来查找数组的布尔属性的端点。

例如numpy.nonzero(a)[0] [ - 1]是(dimension = 0)的最后一个非零元素的索引,同样numpy.nonzero(a)[0] [0]是第一个非零元素的索引。

如果我们知道我们只关心第一个或最后一个元素,那么我们可以使用更少的内存,并且比上面运行“非零”具有更好的公共情况运行时。例如,如果我们坚持线性搜索,我们至少可以从适当的一端开始(向后搜索以找到与条件匹配的最后一个值)。或者我们可以使用二进制搜索(例如,如果中间元素匹配条件,我们不需要检查前半部分以找到它的真实的最后一个元素)。 这似乎很普遍,可能有一个现有的实现,但我没有找到类似的东西。

1 个答案:

答案 0 :(得分:7)

您可以使用argmax找到布尔数组的第一个True元素。

a = np.array([False, False, True, True, True])
first_True = a.argmax()
last_True = len(a) - 1 - a[::-1].argmax()

您可以使用argmin来查找False值,这比使用非零值更快,占用的内存更少,但这在a的长度上是线性的。如果你想要比线性更快,你需要知道a是“已排序”,对于一个布尔数组,这意味着你有一个False块,后跟所有True。在这种情况下,您可以使用搜索排序来查找False和true之间的边界:

first_True = a.searchsorted(True, 'left')