我有一个numpy数组,它是一个向量(1乘n)。我想在它遇到布尔表达式(大于某个数字)的第一个和最后一个出现之间进行子集化。
即。类似的东西:
positions = numpy.where(myArray >= value)[0]
subset = myArray[positions[0]:positions[-1]+1]
这是一个解决方案,但据我了解,这将涉及搜索整个数组两次以检索positions
结果。 myArray
可能非常大,还有其他解决方案吗?
答案 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。