簡體   English   中英

第一組非零值(通過忽略零的單次出現)

[英]First group of non-zero values (by neglecting single occurrence of zero)

這是我打算在Python中執行的操作:

我有一個數組( freq_arr )。 我想找到第一組非零元素的索引。 我從頭開始搜索非零元素,當我找到第一個非零元素(在下面的示例中,第一個元素為5)時,我記錄了它的索引(在以下示例中為4)。 我搜索下一個,並記錄其索引(將為5)。 如果遇到單個零,我想忽略它並繼續搜索非零值。 這樣,我考慮了具有索引4,5,6,7,8,9和10的值5,6,0,8,9,0,1。在這些值之后,有五個零,因此我停止了搜索。 輸出中最多可以存在兩個零 ,然后繼續搜索。 但是,如果遇到3個或更多的零,我想停止搜索。

輸入:

freq_arr = np.array([0, 0, 0, 0, 5, 6, 0, 8, 9, 0, 1, 0, 0, 0, 0, 3, 6, 0])

輸出:

out_arr_indices = [4, 5, 6, 7, 8, 9, 10]

我知道使用for循環對此進行編碼,但是我想避免使用它,因為它效率不高。 請讓我知道如何做到這一點。

該數組將是一維的。 每個元素的范圍是5000到20000。

如果我正確理解了您的問題,那么您要遍歷列表,並連續跳過兩個零或更少的零,並將非零值的索引添加到輸出數組。 也許像下面這樣

freq_arr = [0, 0, 5, 6, 0, 8, 9, 0, 1, 0, 0, 0, 0, 3, 6, 0]
outputarr = []

count = 0
zerocount = 0

while count < len(freq_arr) and zerocount < 3:
    if freq_arr[count] == 0:
        zerocount += 1
    else:
        zerocount = 0
        outputarr.append(count)
    count += 1

如果您提供更多詳細信息,我們可能會提供更好的幫助。

這是切片和argmax的一種方法(檢測非零和零)-

def start_stop_indices(freq_arr, W=3):
    nnz_mask = freq_arr!=0
    start_idx = nnz_mask.argmax()
    m0 = nnz_mask[start_idx:]
    kernel = np.ones(W,dtype=int)
    last_idx = np.convolve(m0, kernel).argmin() + start_idx - W
    return start_idx, last_idx

樣品運行-

In [203]: freq_arr
Out[203]: array([0, 0, 0, 0, 5, 6, 0, 8, 9, 0, 1, 0, 0, 0, 0, 3, 6, 0])

In [204]: start_stop_indices(freq_arr, W=3)
Out[204]: (4, 10)

In [205]: start_stop_indices(freq_arr, W=2)
Out[205]: (4, 10)

In [206]: start_stop_indices(freq_arr, W=1)
Out[206]: (4, 5)

這是另一個用於length = 3的固定窗口搜索的方法,它避免了使用convolution並更多地使用slicing -

def start_stop_indices_v2(freq_arr):
    nnz_mask = freq_arr!=0
    start_idx = nnz_mask.argmax()
    m0 = nnz_mask[start_idx:]
    idx0 = (m0[:-2] | m0[1:-1] | m0[2:]).argmin()
    last_idx = idx0 + start_idx - 1
    return  start_idx, last_idx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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