簡體   English   中英

邏輯表達式匹配的第一個和最后一次出現之間的numpy子集數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM