簡體   English   中英

用python容差唯一化一個數組/列表(等效於Uniquetol)

[英]uniquify an array/list with a tolerance in python (uniquetol equivalent)

我想找到在一定公差范圍內的數組的唯一元素

例如,對於數組/列表

[1.1 , 1.3 , 1.9 , 2.0 , 2.5 , 2.9]

函數將返回

[1.1 , 1.9 , 2.5 , 2.9]

如果公差為0.3

有點像MATLAB函數http://mathworks.com/help/matlab/ref/uniquetol.html (但是此函數使用相對公差,絕對公差就足夠了)實現它的pythonic方法是什么? numpy是特權)

A作為輸入數組,並將tol作為公差值,我們可以采用NumPy broadcasting的矢量化方法,如下所示:

A[~(np.triu(np.abs(A[:,None] - A) <= tol,1)).any(0)]

樣品運行-

In [20]: A = np.array([2.1,  1.3 , 1.9 , 1.1 , 2.0 , 2.5 , 2.9])

In [21]: tol = 0.3

In [22]: A[~(np.triu(np.abs(A[:,None] - A) <= tol,1)).any(0)]
Out[22]: array([ 2.1,  1.3,  2.5,  2.9])

注意1.9消失了,因為我們在0.3的公差范圍內有2.1 然后, 1.1一去不復返了1.32.02.1

請注意,這將創建一個帶有“ chained-closeness”檢查的唯一數組。 舉個例子 :

In [91]: A = np.array([ 1.1,  1.3,  1.5,  2. ,  2.1,  2.2, 2.35, 2.5,  2.9])

In [92]: A[~(np.triu(np.abs(A[:,None] - A) <= tol,1)).any(0)]
Out[92]: array([ 1.1,  2. ,  2.9])

因此, 1.31.1而消失,而1.51.3而消失。

在純Python 2中,我編寫了以下代碼:

a = [1.1, 1.3, 1.9, 2.0, 2.5, 2.9]                                              

# Per http://fr.mathworks.com/help/matlab/ref/uniquetol.html                                                                                    
tol = max(map(lambda x: abs(x), a)) * 0.3                                       

a.sort()                                                                        

results = [a.pop(0), ]                                                          

for i in a:
    # Skip items within tolerance.                                                                     
    if abs(results[-1] - i) <= tol:                                             
        continue                                                                
    results.append(i)                                                           

print a                                                                         
print results

導致

[1.3, 1.9, 2.0, 2.5, 2.9]
[1.1, 2.0, 2.9]

該規范似乎與之吻合,但與您的示例不一致。

如果我只是將公差設置為0.3而不是max(map(lambda x: abs(x), a)) * 0.3 ,則會得到:

[1.3, 1.9, 2.0, 2.5, 2.9]
[1.1, 1.9, 2.5, 2.9]

...這與您的示例一致。

暫無
暫無

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

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