我有一个 numpy 数组,它是一个向量(1 × n)。我想在它遇到 bool 表达式(大于某个数字)的第一次和最后一次出现之间对它进行子集化。
即大致如下:
positions = numpy.where(myArray >= value)[0]
subset = myArray[positions[0]:positions[-1]+1]
这是一种解决方案,但据我了解,这将涉及搜索整个数组两次以检索 positions
结果。 myArray
可能会很大,那么还有其他解决方案吗?
最佳答案
让我们列出一些方法:
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 中,但针对 numpy 2.0。更多信息可查看here .
关于python - 第一次和最后一次出现的逻辑表达式匹配之间的 Numpy 子集数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22478240/