逻辑表达式匹配的第一个和最后一个出现之间的Numpy子集数组

时间:2014-03-18 11:38:34

标签: python arrays numpy indexing

我有一个numpy数组,它是一个向量(1乘n)。我想在它遇到布尔表达式(大于某个数字)的第一个和最后一个出现之间进行子集化。

即。类似的东西:

positions = numpy.where(myArray >= value)[0]
subset = myArray[positions[0]:positions[-1]+1]

这是一个解决方案,但据我了解,这将涉及搜索整个数组两次以检索positions结果。 myArray可能非常大,还有其他解决方案吗?

1 个答案:

答案 0 :(得分:3)

让我们列出一些方法:

def original(arr, val):
    pos = np.where(arr>=val)[0]
    return arr[pos[0]:pos[-1]+1]

def with_argmax(arr, val):
    pos = (arr>=val)
    return arr[pos.argmax():-pos[::-1].argmax() or None]

使用中等大小的数组设置并使用少量值进行剪辑:

arr = np.ones(1E5)
arr[:300] = 0; arr[-300:]=0

时序:

%timeit original(arr,1)
1000 loops, best of 3: 504 µs per loop

%timeit with_argmax(arr,1)
1000 loops, best of 3: 297 µs per loop

相同的数组大小,有更多要剪辑的值:

arr = np.ones(1E5)
arr[:2E4] = 0; arr[-2E4:]=0

时序:

%timeit original(arr,1)
1000 loops, best of 3: 528 µs per loop

%timeit with_argmax(arr,1)
1000 loops, best of 3: 296 µs per loop

你真正想要的是找到第一个非零元素"这个例程目前还没有,但是针对numpy 2.0。可以找到更多信息here