在python中有没有一种方法可以从数组中删除类似的(数字)元素
我有一个生成数组的函数:在python中有没有一种方法可以从数组中删除类似的(数字)元素,python,arrays,numpy,Python,Arrays,Numpy,我有一个生成数组的函数: [ 14 48 81 111 112 113 114 148 179 213 247 279 311 313 314 344 345 346] 对应于曲线与x轴相交的数据值。由于数据不完美,它会产生误报,其中我的输出数组中的元素彼此非常接近,例如[111 112 113 114]。我需要从这个数组中删除误报,但仍然保留误报显示位置周围的初始阳性。基本上我需要我的函数来产生和数组更像 [ 14 48 81 112 148 179 213 247 279 313
[ 14 48 81 111 112 113 114 148 179 213 247 279 311 313 314 344 345 346]
对应于曲线与x轴相交的数据值。由于数据不完美,它会产生误报,其中我的输出数组中的元素彼此非常接近,例如[111 112 113 114]。我需要从这个数组中删除误报,但仍然保留误报显示位置周围的初始阳性。基本上我需要我的函数来产生和数组更像
[ 14 48 81 112 148 179 213 247 279 313 345]
不完美数据的误报已被消除。以下是一种可能的方法:
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]
这个可以
#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))
#arr是您想要的数组,num是它们之间的数字差
def检查(arr,num):
对于arr中的r:
对于arr中的c:
如果abs(r-c)
我会按照以下方式做:
概念上:
假设数字的十是10的数量,可以用给定的数字来拟合,例如111的十是11,247的十是24,250的十是25,依此类推。
对于我们的数据,如果给定10的数字已经存在,则丢弃它
代码:
请注意,
10
只是一个示例值,您可以用另一个值替换它-值越大意味着可能删除的元素越多。请记住,此解决方案的具体特点是,特定值对(例如10
和110
和111
)将被视为不同的,并将保留在输出列表中,因此您需要检查在您的使用情况下这是否不是问题。到目前为止您尝试了什么?还有什么规定一个值是假阳性的,假设您是示例子列表111112113114
,我们如何知道112
是正确的,并且它周围的一切都是假阳性的?欢迎使用堆栈溢出。请阅读此文,因为它将帮助您正确设置问题的格式——如何创建一个最小、完整且可验证的示例——只要您对“非常接近”或“假阳性”有更精确的定义,就应该很容易。如果误报是由于数据中的噪声造成的,则可能的方法是应用低通滤波器来消除高频噪声(使用FFT)。噪声较少的结果数据将具有较少(或没有)误报。类似的方法是应用移动平均,如果相似值组跨越10的倍数边界,这肯定不起作用?与数组类似的是[34536869707195],它将返回[3453687095]作为[34536869707195]
它将给出[3453687095]
,正如您所写的,但请注意,例如对于[49507980101]
它将生成[49507980109]
。简单地说:对于某些情况,我的解决方案会产生与其他基于偏移量的方法不同的结果。另外,您(通常)不应该修改正在迭代的列表。
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]