簡體   English   中英

如何有效地替換一維數組中相同的連續值

[英]How to replace identical consecutive values from a 1D array efficiently

令人驚訝的是,經過相當多的研究,我沒有發現任何帖子引發了解決這個簡單問題的好主意。

我有一個形狀為(n, )的一維numpy數組,它大部分是零和一些其他正值。

D = np.zeros(10)
D[2] = 1
D[5] = 4
D[7] = 3

Out: array([0., 0., 1., 0., 0., 4., 0., 3., 0., 0.])

但是,有時,其中一個值(它是給定樣本的觸發器)可能會在下一個(或幾個下一個樣本)期間重復。

D = np.zeros(10)
D[2] = 1
D[3] = 1
D[5] = 4
D[7] = 3

Out: array([0., 0., 1., 1., 0., 4., 0., 3., 0., 0.])

在這種情況下,我想處理數組以用 0 替換相同的連續值; 在這種情況下,將第二個1替換為0

In: array([0., 0., 1., 1., 0., 4., 0., 3., 0., 0.])
Out: array([0., 0., 1., 0., 0., 4., 0., 3., 0., 0.])

對於一個額外的復雜度級別,我想定義一個容差,如果值x>0之后的每個元素都足夠接近x ,那么它們將被 0 替換。

In: array([0., 0., 1., 0.98, 1.01, 4., 0., 3., 3.1, 0.]), tolerance = 0.05
Out: array([0., 0., 1., 0., 0., 4., 0., 3., 3.1, 0.])

這很容易通過使用whilefor循環在數組上循環來實現。 然而,由於這是一個在線應用程序,我一直在 numpy 中尋找矢量化解決方案。 如果有人有任何建議,任何 function 我可以考慮盡可能高效地執行此操作,請發表評論!

嘗試像這樣使用np.diff()

D[np.where(np.diff(D)==0)] = 0

編輯:包括OP的解決方案,包括公差和前置:

D[np.where(np.diff(D, prepend=[0])<=tolerance)] = 0

編輯 2:@obchardon 刪除不必要的np.where的極好建議:

D[abs(np.diff(D, prepend=[0]))<=tolerance] = 0

暫無
暫無

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

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