簡體   English   中英

查找numpy數組中兩個數字指定匹配的所有匹配項

[英]Find all occurences of a specified match of two numbers in numpy array

我需要實現的是獲取所有索引的數組,在我的數據數組中填充零和一的是從零步進到一。 我需要一個非常快速的解決方案,因為我必須處理數百萬個以百分數表示的長方體。 它將在計算中心中運行。 例如..

data_array = np.array([1,1,0,1,1,1,0,0,0,1,1,1,0,1,1,0])
result = [3,9,13]

嘗試這個:

In [23]: np.where(np.diff(a)==1)[0] + 1
Out[23]: array([ 3,  9, 13], dtype=int64)

100M元素數組的時間:

In [46]: a = np.random.choice([0,1], 10**8)

In [47]: %timeit np.nonzero((a[1:] - a[:-1]) == 1)[0] + 1
1 loop, best of 3: 1.46 s per loop

In [48]: %timeit np.where(np.diff(a)==1)[0] + 1
1 loop, best of 3: 1.64 s per loop

步驟如下:

  1. 計算數組的差異
  2. 找到diff == 1的索引
  3. 將1加到結果中(b / c len(diff) = len(orig) - 1

所以試試這個:

index = numpy.nonzero((data_array[1:] - data_array[:-1]) == 1)[0] + 1
index
# [3, 9, 13]

好,非常感謝大家。 非零的解決方案對我來說可能更好,因為我需要知道從0-> 1到1-> 0的步長,並最終計算出差值。 這就是我的解決方案。 任何其他建議表示贊賞。)

i_in  = np.nonzero(  (data_array[1:] - data_array[:-1]) ==  1   )[0] +1
i_out = np.nonzero(  (data_array[1:] - data_array[:-1]) == -1   )[0] +1

i_return_in_time = (i_in - i_out[:i_in.size] ) 

由於它是一個充滿0s1s的數組,您可以受益於僅比較而不是在單移位版本之間執行算術運算,即可直接為我們提供布爾數組,該布爾數組可以饋入np.flatnonzero以獲取索引和最終輸出。

因此,我們將有一個這樣的實現-

np.flatnonzero(data_array[1:] > data_array[:-1])+1

運行時測試-

In [26]: a = np.random.choice([0,1], 10**8)

In [27]: %timeit np.nonzero((a[1:] - a[:-1]) == 1)[0] + 1
1 loop, best of 3: 1.91 s per loop

In [28]: %timeit np.where(np.diff(a)==1)[0] + 1
1 loop, best of 3: 1.91 s per loop

In [29]: %timeit np.flatnonzero(a[1:] > a[:-1])+1
1 loop, best of 3: 954 ms per loop

暫無
暫無

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

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