我有一个函数可以生成这样的数组:
[ 14 48 81 111 112 113 114 148 179 213 247 279 311 313 314 344 345 346]
对应于曲线与x轴交叉的数据值。由于数据不完美,因此会产生误报,其中我的输出数组中的元素彼此非常接近,例如[111112113114]。我需要从此数组中删除误报,但仍要保留误报显示位置附近的初始正值。基本上我需要我的函数来产生和排列更像
[ 14 48 81 112 148 179 213 247 279 313 345]
删除了来自不完善数据的误报。
答案 0 :(得分:3)
这是一种可能的方法:
arr = [14, 48, 81, 111, 112, 113, 114, 148, 179, 213, 247, 279, 311, 313, 314, 344, 345, 346]
def filter_arr(arr, offset):
filtered_nums = set()
for num in sorted(arr):
# Check if there are any "similar" numbers already found
if any(num+x in filtered_nums for x in range(-offset, offset+1)):
continue
else:
filtered_nums.add(num)
return list(sorted(filtered_nums))
然后,您可以应用您认为最合理的任何偏移量进行过滤。
filter_arr(arr, offset=5)
Output: [14, 48, 81, 111, 148, 179, 213, 247, 279, 311, 344]
答案 1 :(得分:0)
可以做到
#arr is the array you want, num is the number difference between them
def check(arr, num):
for r in arr:
for c in arr:
if abs(r-c) < num + 1:
arr.remove(c)
return arr
yourarray = [14,48 ,81 ,111 ,112 ,113 ,114, 148 , 179 ,213 ,247 ,279 ,311, 313 ,314 ,344, 345, 346]
print(check(yourarray, 1))
答案 2 :(得分:0)
我将按照以下方式进行操作:
从概念上讲: 可以说数字十是可以装入给定数字的数量10,例如111的十是11,247的十是24,而250的十是25,依此类推。 对于我们的数据,如果已经存在给定十个数字,则将其丢弃。
代码:
data = [14,48,81,111,112,113,114,148,179,213,247,279,311,313,314,344,345,346]
cleaned = [i for inx,i in enumerate(data) if not i//10 in [j//10 for j in data[:inx]]]
print(cleaned) #[14, 48, 81, 111, 148, 179, 213, 247, 279, 311, 344]
请注意,10
仅是示例值,可以替换为另一个值-较大的值表示可能会删除更多元素。请记住,此解决方案的特定特征是特定值对(例如10
和110
(例如111
)将被视为不同的值并保留在输出列表中,因此您需要检查在您的使用情况下这是否不是问题。