如何在python中匹配两个相似但不完全相同的坐标集

时间:2019-04-16 21:01:31

标签: python

我有两组节点。节点集A包含节点ID和节点XYZ坐标的列表,例如:(ID:int,[x:浮点,y:浮点,z:浮点])。节点集B包含节点温度和节点XYZ坐标。集合A中的所有节点都应该(但不一定)在集合B中找到,但是集合B也可以包含其他节点。我需要根据它们的坐标将集合A中的节点与集合B中的相应节点进行匹配。主要问题是它们的坐标不完全匹配(存在浮动错误)。

该解决方案最好避免使用非标准库。我已经编码了我认为不是解决该问题的最佳解决方案的代码。我试图创建一个包含集合B的字典。键由一个包含截断坐标的元组组成,其中温度为值。然后,我使用截断的集合A坐标查询字典。 我想知道是否有更优雅,更准确的方法来解决该问题?

1 个答案:

答案 0 :(得分:0)

You can probably make use of math.isclose, it requires a bit of tuning depending on your inputs (carefully selecting rel_tol and abs_tol based on your use case).

Any many cases default values will do:

import itertools
import math

def matching_temperatures(A, B):
  temperatures = dict()

  for a, b in itertools.product(A, B):
    a_id, a_xyz = a
    b_temp, b_xyz = b
    if all(math.isclose(i, j) for i, j in zip(a_xyz, b_xyz)):
      temperatures[a_id] = b_temp

  return temperatures

# Let's say our coordinates have the following error margin:
epsilon = 1e-9

A = (
  ('a', (3.3, 2.2, 1.1)), 
  ('b', (10.1, 20.2, 30.3))
)
# Same coordinates as A with a ±epsilon error: 
B = (
  ('1°c', (3.3+epsilon, 2.2-epsilon, 1.1+epsilon)), 
  ('2°c', (10.1-epsilon, 20.2+epsilon, 30.3+epsilon))
)

print(matching_temperatures(A, B))

In this particular example, this will print {'a': '1°c', 'b': '2°c'}.

But in some cases (for example your errors are greater than the default rel_tol of 1e-9) then you will need to specify this: math.isclose(i, j, rel_tol=your_epsilon).