![](/img/trans.png)
[英]Is there a pythonic way to sample N consecutive elements from a list or numpy array
[英]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
循環。
numpy.add.accumulate
示例或itertools.accumulate可能最能說明它在做什么。ufunc
(通用函數)應用。代碼:(使用擴展數組來交叉檢查一些其他情況,但也適用於您的數組)
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 時的周轉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.