填补角度列表之间的空白(数字)

发布于 2025-01-30 20:16:20 字数 4851 浏览 4 评论 0原文

我会说明简单的例子,然后进入深处 如果我有一个数字列表包括

t_original = [180,174,168,166,162,94,70,80,80,128,131,160,180]

180,174,168,166,162,94,70,80,80,128,131,160,180

t_original = [ “ nofollow noreferrer”> “在此处输入图像描述” 但是,如果我们突然将第四值(166)乘以450,那么列表将是

t = [180,174,168,700,162,94,70,80,128,131,160,180]

]

我想将第四值(700)视为错误的值 即使不是原始值,我也想用相对值替换它,而是相对于前两个要素(168,174) 我想为整个列表做同样的

如果再次出现错误的值,

事情

我尝试过的方法

”在此处输入图像描述”

,我将与输出共享我的代码,过滤后的施加填充间隙功能

我的

def preprocFN(*U):
prePlst=[] # after preprocessing list
#preprocessing Fc =| 2*LF1 prev by 1 - LF2 prev by 2 |
c0 = -2     #(previous) by 2
c1 =-1      #(previous)
c2 =0       #(current)
c3 = 1      #(next)
preP = U[0] # original list
if c2 == 0:
    prePlst.append(preP[0])
    prePlst.append(preP[1])
    c1+=2
    c2+=2
    c0+=2
oldlen = len(preP)
while oldlen > c2:
    Equ = abs(2*preP[c1] - preP[c0]) #fn of preprocessing #removed abs()
    formatted_float = "{:.2f}".format(Equ) #with .2 number only
    equu = float(formatted_float)          #from string float to float
    prePlst.insert(c2,equu)      # insert the preprocessed value to the List
    c1+=1
    c2+=1
    c0+=1

return prePlst

输入: https://textuploader.com/t1py9

输出将为: https://textuploader.com/t1pyk

当打印高于180(错误值)的值时,

result_list = [item for item in list if item > 180]

没有意义的

人类的任何关节都可以通过180的角度是 [183.6, 213.85, 221.62, 192.05, 203.39, 197.22, 188.45, 182.48, 180.41, 200.09, 200.67, 198.14, 199.44, 198.45, 200.55, 193.25, 204.19, 204.35, 200.59, 211.4, 180.51, 183.4, 217.91, 218.94, 213.79 ,205.62,221.35,182.39,180.62,183.06,180.78,231.09,227.33,224.49,237.02,212.53,207.0,207.0,212.92,182.28,182.28,282.28,254.02 4.68,233.63 , 182.84, 193.94, 226.8, 223.69, 222.77, 180.67, 184.72, 180.39, 183.99, 186.44, 233.35, 228.02, 195.31, 183.97, 185.26, 182.13, 207.09, 213.21, 238.41, 229.38, 181.57, 211.19, 180.05, 181.47, 199.69 ,213.59,191.99,194.65,190.75,190.93,221.43,181.51,181.42,180.22],

因此提出的方法的填充差距FN不做它的工作 有任何建议以不同的方式应用相同的概念吗?

额外的信息可能会有所帮助

过滤图包括填充间隙功能,然后应用归一化功能 我认为问题不是来自归一化功能,因为我认为填充间隙函数的输出也许我错了,但无论如何我提供了归一化的步骤,因此您可以获得如何制作最终的过滤图形

fn:

在此处输入图像描述“

我的代码:

def outLiersFN(*U):
outliers=[] # after preprocessing list
#preprocessing Fc =| 2*LF1 prev by 1 - LF2 prev by 2 |
c0 = -2     #(previous) by 2 #from original
c1 =-1      #(previous)      #from original
c2 =0       #(current)       #from original
c3 = 1      #(next)          #from original
preP = U[0] # original list
if c2 == 0:
    outliers.append(preP[0])
    c1+=1
    c2+=1
    c0+=1
    c3+=1
oldlen = len(preP)
M_RangeOfMotion = 90
while oldlen > c2 :
    if c3 == oldlen:
        outliers.insert(c2, preP[c2]) #preP[c2] >> last element in old list
        break
    if (preP[c2] > M_RangeOfMotion and preP[c2] < (preP[c1] + preP[c3])/2) or (preP[c2] < M_RangeOfMotion and preP[c2] > (preP[c1] + preP[c3])/2): #Check Paper 3.3.1
        Equ = (preP[c1] + preP[c3])/2 #fn of preprocessing # From third index # ==== inserting current frame
        formatted_float = "{:.2f}".format(Equ) #with .2 number only
        equu = float(formatted_float)          #from string float to float
        outliers.insert(c2,equu)      # insert the preprocessed value to the List
        c1+=1
        c2+=1
        c0+=1
        c3+=1
    else :
        Equ = preP[c2] # fn of preprocessing #put same element (do nothing)
        formatted_float = "{:.2f}".format(Equ)  # with .2 number only
        equu = float(formatted_float)  # from string float to float
        outliers.insert(c2, equu)  # insert the preprocessed value to the List
        c1 += 1
        c2 += 1
        c0 += 1
        c3 += 1
return outliers

i'll explain for simple example then go into the deep
if i have a list of number consist of

t_original = [180,174,168,166,162,94,70,80,128,131,160,180]

if we graph this so it goes down from 180 to 70 then it ups to 180 again

enter image description here
but if we suddenly change the fourth value (166) by 450 then the list will be

t = [180,174,168,700,162,94,70,80,128,131,160,180]

which dose not make sense in the graph
enter image description here

i wanna treat the fourth value (700) as a wrong value
i want to replace it with a relative value even if not as the original value but relative to the previous two elements (168,174)
i wanna do the same for the whole list if another wrong value appeared again

we can call that [Filling gaps between list of numbers]

so i'm tryig to do the same idea but for bigger example
enter image description here

the method i have tried

enter image description here

and i'll share my code with output , filtered means applied filling gap function

my code

def preprocFN(*U):
prePlst=[] # after preprocessing list
#preprocessing Fc =| 2*LF1 prev by 1 - LF2 prev by 2 |
c0 = -2     #(previous) by 2
c1 =-1      #(previous)
c2 =0       #(current)
c3 = 1      #(next)
preP = U[0] # original list
if c2 == 0:
    prePlst.append(preP[0])
    prePlst.append(preP[1])
    c1+=2
    c2+=2
    c0+=2
oldlen = len(preP)
while oldlen > c2:
    Equ = abs(2*preP[c1] - preP[c0]) #fn of preprocessing #removed abs()
    formatted_float = "{:.2f}".format(Equ) #with .2 number only
    equu = float(formatted_float)          #from string float to float
    prePlst.insert(c2,equu)      # insert the preprocessed value to the List
    c1+=1
    c2+=1
    c0+=1

return prePlst

with my input : https://textuploader.com/t1py9

the output will be : https://textuploader.com/t1pyk

and when printing the values higher than 180 (wrong values)

result_list = [item for item in list if item > 180]

which dosen't make sense that any joint of human can pass the angle of 180

the output was [183.6, 213.85, 221.62, 192.05, 203.39, 197.22, 188.45, 182.48, 180.41, 200.09, 200.67, 198.14, 199.44, 198.45, 200.55, 193.25, 204.19, 204.35, 200.59, 211.4, 180.51, 183.4, 217.91, 218.94, 213.79, 205.62, 221.35, 182.39, 180.62, 183.06, 180.78, 231.09, 227.33, 224.49, 237.02, 212.53, 207.0, 212.92, 182.28, 254.02, 232.49, 224.78, 193.92, 216.0, 184.82, 214.68, 182.04, 181.07, 234.68, 233.63, 182.84, 193.94, 226.8, 223.69, 222.77, 180.67, 184.72, 180.39, 183.99, 186.44, 233.35, 228.02, 195.31, 183.97, 185.26, 182.13, 207.09, 213.21, 238.41, 229.38, 181.57, 211.19, 180.05, 181.47, 199.69, 213.59, 191.99, 194.65, 190.75, 199.93, 221.43, 181.51, 181.42, 180.22]

so the filling gaps fn from proposed method dosen't do it's job
any suggestion for applying the same concept with a different way ?

Extra Info may help

the filtered graph consists of filling gap function and then applying normalize function
i don't think the problem is from the normalizing function since the output from the filling gaps function isn't correct in my opinion maybe i'm wrong but anyway i provide the normalize steps so you get how the final filtered graph has been made

fn :

enter image description here

My Code :

def outLiersFN(*U):
outliers=[] # after preprocessing list
#preprocessing Fc =| 2*LF1 prev by 1 - LF2 prev by 2 |
c0 = -2     #(previous) by 2 #from original
c1 =-1      #(previous)      #from original
c2 =0       #(current)       #from original
c3 = 1      #(next)          #from original
preP = U[0] # original list
if c2 == 0:
    outliers.append(preP[0])
    c1+=1
    c2+=1
    c0+=1
    c3+=1
oldlen = len(preP)
M_RangeOfMotion = 90
while oldlen > c2 :
    if c3 == oldlen:
        outliers.insert(c2, preP[c2]) #preP[c2] >> last element in old list
        break
    if (preP[c2] > M_RangeOfMotion and preP[c2] < (preP[c1] + preP[c3])/2) or (preP[c2] < M_RangeOfMotion and preP[c2] > (preP[c1] + preP[c3])/2): #Check Paper 3.3.1
        Equ = (preP[c1] + preP[c3])/2 #fn of preprocessing # From third index # ==== inserting current frame
        formatted_float = "{:.2f}".format(Equ) #with .2 number only
        equu = float(formatted_float)          #from string float to float
        outliers.insert(c2,equu)      # insert the preprocessed value to the List
        c1+=1
        c2+=1
        c0+=1
        c3+=1
    else :
        Equ = preP[c2] # fn of preprocessing #put same element (do nothing)
        formatted_float = "{:.2f}".format(Equ)  # with .2 number only
        equu = float(formatted_float)  # from string float to float
        outliers.insert(c2, equu)  # insert the preprocessed value to the List
        c1 += 1
        c2 += 1
        c0 += 1
        c3 += 1
return outliers

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爺獨霸怡葒院 2025-02-06 20:16:20

我建议以下算法:

  • 数据点t [i],如果它偏离t [i-2],t [i-1],t [i ],t [i+1],t [i+2]>超过这5个元素的标准偏差。
  • 离群值被周围两个要素的平均值所取代。
import matplotlib.pyplot as plt
from statistics import mean, stdev

t = [180,174,168,700,162,94,70,80,128,131,160,180]

def smooth(t):
    new_t = []
    for i, x in enumerate(t):
        neighbourhood = t[max(i-2,0): i+3]
        m = mean(neighbourhood)
        s = stdev(neighbourhood, xbar=m)
        if abs(x - m) > s:
            x = ( t[i - 1 + (i==0)*2] + t[i + 1 - (i+1==len(t))*2] ) / 2
        new_t.append(x)
    return new_t

new_t = smooth(t)

plt.plot(t)
plt.plot(new_t)
plt.show()

I suggest the following algorithm:

  • data point t[i] is considered an outlier if it deviates from the average of t[i-2], t[i-1], t[i], t[i+1], t[i+2] by more than the standard deviation of these 5 elements.
  • outliers are replaced by the average of the two elements around them.
import matplotlib.pyplot as plt
from statistics import mean, stdev

t = [180,174,168,700,162,94,70,80,128,131,160,180]

def smooth(t):
    new_t = []
    for i, x in enumerate(t):
        neighbourhood = t[max(i-2,0): i+3]
        m = mean(neighbourhood)
        s = stdev(neighbourhood, xbar=m)
        if abs(x - m) > s:
            x = ( t[i - 1 + (i==0)*2] + t[i + 1 - (i+1==len(t))*2] ) / 2
        new_t.append(x)
    return new_t

new_t = smooth(t)

plt.plot(t)
plt.plot(new_t)
plt.show()

smoothing outliers

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文