如果两个列表超过给定的欧几里德距离,如何从两个列表中删除特定值?

Posted

技术标签:

【中文标题】如果两个列表超过给定的欧几里德距离,如何从两个列表中删除特定值?【英文标题】:How to remove a specific value from two lists if they exceed a given Euclidean distance? 【发布时间】:2022-01-19 05:47:22 【问题描述】:

我有这两个数据列表x & y。现在我想删除特定的笛卡尔点(x,y),它的距离超过了特定的欧几里得距离(示例:4)。该怎么做?

x = [92.5 , 92.75 ,92.75, 93. ,  93.,   93.25 ,93.25, 93.25,
 93.25 ,93.25 ,93.25 ,93.25 ,93. ,  92.5,  93.  , 93.  , 93.,  
 92.5 , 92.75, 93.  , 93.25, 93.25 ,93.5  ,93.5 , 93.5  ,93.5 , 
 91.5 , 92.5  ,92.5  ,92.5 , 92. ,  92.,   92.  , 91.75 ,91.5 , 
 91.5 , 91.25 ,91.  , 91.25 ,91.25, 91.25 ,91.]

y = [17.75, 17.75 ,18. ,  18. ,  18.  , 18.25, 18.25 ,18.5,
18.5 , 18.5 , 18.75 ,18.75 ,18.75, 24.75 ,19. ,  18.75, 18.75, 
 18.75 ,18.75 ,18.75 ,19.   ,19. ,  19.25, 19.5 , 19.5 , 19.75 ,
 24.25 ,24.75 ,24.75 ,24.75 ,24.25, 24.25 ,24.25 ,24.25 ,24.75, 
 24.25 ,23.75, 23.75 ,23.75 ,24.25 ,23.75 ,23.75]

这就是我所做的,但没有成功。

for k in range(len(x)):
  x1 = x[k]
  y1 = y[k]
  x2 = x[k+1]
  y2 = y[k+1]

  distance = np.sqrt((x2-x1)**2+(y2-y1)**2)
  
  if distance>4:
    x.remove(k)
    y.remove(k) 

【问题讨论】:

【参考方案1】:

您可以zipxy,以及这两者的一个移位列表并迭代这个压缩对象。对于测试,不要使用外部库取平方根,而是将每个数字平方。这个解决方案可能是这里最快的一个,包括 numpy 解决方案。

new_x, new_y = [], []
for x1,x2,y1,y2 in zip(x,x[1:],y,y[1:]):
    if (x2 - x1) *(x2 - x1) + (y2 - y1) *(y2 - y1) <= 4 *4:
        new_x.append(x1)
        new_y.append(y1)

【讨论】:

还有一些问题。也许我无法更早地澄清这个问题。让我再次澄清一下:假设我有 x=[2,3,8,8,8,9,7,2,3,5] 现在,您创建的循环将返回值 x_tmp = [2,3,8,8,9,7,3,5] 但我需要这个结果:x_tmp=[2,3,2,3,5]。我的意思是仍有一些价值是遥远的。 @TahmidulAzomSany 你是怎么从x 那里得到x_temp 的? y 是什么? 考虑这个:``` x = [2,3,8,8,8,9,7,2,3,5] y = [2,3,4,5,5, 6,7,8,9,4] x_tmp, y_tmp = [ ], [ ] for k in range(len(x)-1): # Till len(x) will give index out of range error x1, x2, y1 , y2 = x[k], x[k+1], y[k], y[k+1] 距离 = np.sqrt((x2-x1)**2+(y2-y1)**2)如果距离 【参考方案2】:

更快、更简洁的解决方案:

dists = np.sqrt(np.diff(x)**2 + np.diff(y)**2)
mask = np.nonzero(dists <= 4)[0]

new_x = x[mask]
new_y = y[mask]

为此,您需要先将列表转换为 numpy 数组:x = np.array(x)

此解决方案与此线程中介绍的其他解决方案等效。

【讨论】:

还有一些问题。也许我无法更早地澄清这个问题。让我再次澄清一下:假设我有 x=[2,3,8,8,8,9,7,2,3,5] 现在,您创建的循环将返回值 x_tmp = [2,3,8,8,9,7,3,5] 但我需要这个结果:x_tmp=[2,3,2,3,5]。我的意思是仍有一些价值是遥远的。【参考方案3】:

这可以解决您的问题,

import numpy as np

newX, newY = [], []
for k in range(len(x) - 1):
    if np.sqrt((x[k + 1] - x[k]) ** 2 + (y[k + 1] - y[k]) ** 2) <= 4:
        newX.append(x[k])
        newY.append(y[k])

newX:

[92.5, 92.75, 92.75, 93.0, 93.0, 93.25, 93.25, 93.25, 93.25, 93.25, 93.25, 93.25, 93.0, 93.0, 93.0, 92.5, 92.75, 93.0, 93.25, 93.25, 93.5, 93.5, 93.5, 91.5, 92.5, 92.5, 92.5, 92.0, 92.0, 92.0, 91.75, 91.5, 91.5, 91.25, 91.0, 91.25, 91.25, 91.25]

newX:

[17.75, 17.75, 18.0, 18.0, 18.0, 18.25, 18.25, 18.5, 18.5, 18.5, 18.75, 18.75, 19.0, 18.75, 18.75, 18.75, 18.75, 18.75, 19.0, 19.0, 19.25, 19.5, 19.5, 24.25, 24.75, 24.75, 24.75, 24.25, 24.25, 24.25, 24.25, 24.75, 24.25, 23.75, 23.75, 23.75, 24.25, 23.75]

【讨论】:

当然请@TahmidulAzomSany 还有一些问题。也许我无法更早地澄清这个问题。让我再次澄清一下:假设我有 x=[2,3,8,8,8,9,7,2,3,5] 现在,您创建的循环将返回值 x_tmp = [2,3,8,8,9,7,3,5] 但我需要这个结果:x_tmp=[2,3,2,3,5]。我的意思是仍有一些价值是遥远的。【参考方案4】:

更改运行循环的列表不是一个好主意。此代码可能会对您有所帮助

x = [92.5 , 92.75 ,92.75, 93. ,  93.,   93.25 ,93.25, 93.25, 93.25 ,93.25 ,93.25 ,93.25 ,93. ,  92.5,  93.  , 93.  , 93., 92.5 , 92.75, 93.  , 93.25, 93.25 ,93.5  ,93.5 , 93.5  ,93.5 , 91.5 , 92.5  ,92.5  ,92.5 , 92. ,  92.,   92.  , 91.75 ,91.5 , 91.5 , 91.25 ,91.  , 91.25 ,91.25, 91.25 ,91.]
y = [17.75, 17.75 ,18. ,  18. ,  18.  , 18.25, 18.25 ,18.5, 18.5 , 18.5 , 18.75 ,18.75 ,18.75, 24.75 ,19. ,  18.75, 18.75, 18.75 ,18.75 ,18.75 ,19.   ,19. ,  19.25, 19.5 , 19.5 , 19.75 , 24.25 ,24.75 ,24.75 ,24.75 ,24.25, 24.25 ,24.25 ,24.25 ,24.75, 24.25 ,23.75, 23.75 ,23.75 ,24.25 ,23.75 ,23.75]
x_tmp, y_tmp = [], []
for k in range(len(x)-1): # Till len(x) will give index out of range error
    x1, x2, y1, y2 = x[k], x[k+1], y[k], y[k+1]
    distance = np.sqrt((x2-x1)**2+(y2-y1)**2)
    if distance<=4:
        x_tmp.append(x[k])
        y_tmp.append(y[k])
print(x_tmp, y_tmp)

另外,你在哪里定义了“i”。

【讨论】:

谢谢。它对我有用。我已经编辑了 i ,这是我复制的代码中的一个错字。 还有一些问题。也许我无法更早地澄清这个问题。 让我再次澄清一下: 假设我有,x=[2,3,8,8,8,9,7,2,3,5] 现在,您创建的循环将返回值 x_tmp = [2,3,8,8,9,7,3,5] 但我需要这个结果:x_tmp=[2,3,2,3,5] 我的意思是还有一些距离很远的值。

以上是关于如果两个列表超过给定的欧几里德距离,如何从两个列表中删除特定值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 numpy 或 zip 的情况下找到两个列表之间的欧几里得距离?

列表内列表之间的欧几里得距离

Python:从两个列表构建字典[重复]

从点列表中成对欧几里德距离

Numpy:找到两个 3-D 数组之间的欧几里得距离

识别差异的最佳方法:欧几里得距离、余弦距离还是简单减法?