簡體   English   中英

從 Numpy 數組中刪除比閾值更近的元素的 Pythonic 方法

[英]Pythonic way to remove elements from Numpy array closer than threshold

從已排序的 Numpy 數組中刪除最少元素以使剩余元素之間的最小距離始終大於某個閾值的最佳方法是什么?

例如,如果閾值為1 ,則以下序列[0.1, 0.5, 1.1, 2.5, 3.]將變為[0.1, 1.1, 2.5] 0.5被刪除,因為它太接近0.1但隨后1.1被保留,因為它離0.1足夠遠。

我目前的代碼:

import numpy as np

MIN_DISTANCE = 1    
a = np.array([0.1, 0.5, 1.1, 2.5, 3.])

for i in range(len(a)-1):
    if(a[i+1] - a[i] < MIN_DISTANCE):
        a[i+1] = a[i]

a = np.unique(a)
a
array([0.1, 1.1, 2.5])

有沒有更有效的方法來做到這一點?

請注意,我的問題類似於從彼此更接近的 numpy 數組中刪除值,但不完全相同。

您可以使用numpy.ufunc.accumulate來遍歷數組的相鄰對而不是for循環。


代碼:(使用擴展數組來交叉檢查一些其他情況,但也適用於您的數組)

import numpy as np


MIN_DISTANCE = 1
a = np.array([0.1, 0.5, 0.6, 0.7, 1.1, 2.5, 3., 4., 6., 6.1])
print("original: \n" + str(a))


def my_py_function(arr1, arr2):
    if(arr2 - arr1 < MIN_DISTANCE):
        arr2 = arr1
    return arr2


my_np_function = np.frompyfunc(my_py_function, 2, 1)

my_np_function.accumulate(a, dtype=np.object, out=a).astype(float)


print("complete: \n" + str(a))
a = np.unique(a)
print("unique: \n" + str(a))

結果:

original:
[0.1 0.5 0.6 0.7 1.1 2.5 3.  4.  6.  6.1]
complete:
[0.1 0.1 0.1 0.1 1.1 2.5 2.5 4.  6.  6. ]
unique:
[0.1 1.1 2.5 4.  6. ]

關於執行時間timeit顯示數組長度約為 20 時的周轉。

  • 對於 5 的數組長度,您的代碼要快得多(相對)
  • 而對於數組長度 >>20,累加選項可顯着加快速度(數組長度為 300 的時間約為 35%)

暫無
暫無

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

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