[英]Numpy subset array between first and last occurence of logical expression match
我有一個numpy數組,它是一個向量(1 x n)。 我想在遇到布爾表達式(大於某個數字)的位置的第一個和最后一個出現之間對它進行子集化。
IE瀏覽器遵循以下方式:
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。 更多信息可以在這里找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.