簡體   English   中英

計算 numpy 數組中連續出現的長度不同的值

[英]Count consecutive occurences of values varying in length in a numpy array

假設我在一個 numpy 數組中有一堆數字,我根據返回布爾數組的條件測試它們:

np.random.seed(3456)
a = np.random.rand(8)
condition = a>0.5

使用這個布爾數組,我想計算 True 連續出現的所有長度。 例如,如果我有[True,True,True,False,False,True,True,False,True]我想找回[3,2,1]

我可以使用以下代碼做到這一點:

length,count = [],0
for i in range(len(condition)):

    if condition[i]==True:
        count += 1
    elif condition[i]==False and count>0:
        length.append(count)
        count = 0

    if i==len(condition)-1 and count>0:
        length.append(count)

    print length

但是是否已經為此或 python、numpy、scipy 等函數實現了任何功能來計算給定輸入的列表或數組中連續出現的長度?

如果您已經有一個 numpy 數組,這可能會更快:

>>> condition = np.array([True,True,True,False,False,True,True,False,True])
>>> np.diff(np.where(np.concatenate(([condition[0]],
                                     condition[:-1] != condition[1:],
                                     [True])))[0])[::2]
array([3, 2, 1])

它檢測塊從哪里開始,對第一個和最后一個塊有一些邏輯,並簡單地計算塊開始之間的差異,並丟棄對應於False塊的長度。

這是使用itertools的解決方案(它可能不是最快的解決方案):

import itertools
condition = [True,True,True,False,False,True,True,False,True]
[ sum( 1 for _ in group ) for key, group in itertools.groupby( condition ) if key ]

Out:
[3, 2, 1]

您還可以通過查看條件數組的倒數的索引( np.where結果)來計算連續False值之間的距離。 訣竅是確保布爾數組以False開頭。 基本上,您正在計算True條件之間的邊界之間的距離。

condition = np.array([True, True, True, False, False, True, True, False, True, False])
if condition[0]:
    condition = np.concatenate([[False], condition])

idx = np.where(~condition)[0]

在最后一步,您需要從這些值中減去 1,以便刪除左右邊緣。

>>> np.ediff1d(idx) - 1
array([3, 0, 2, 1])

如果 t 是 np 數組並且按升序排序,則:

d=np.diff(t)
d_incr = np.argwhere(d>0).flatten()
d_incr = np.insert(d_incr, 0, 0)

np 數組 d_incr 將包含發生變化的索引,允許對 d_incr[i-1] 和 d_incr[i] 之間的值組執行操作,因為 i in range(1,d_incr.size)

暫無
暫無

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

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