如何在python中匹配两个相似但不精确的坐标集

2024-04-24 05:21:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 代码id列表节点错误方案解决方案float
1条回答
网友
1楼 · 发布于 2024-04-24 05:21:06

您可能可以使用^{},它需要根据您的输入进行一些调整(根据您的用例仔细选择rel_tolabs_tol)。你知道吗

在许多情况下,默认值都可以:

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))

在这个特定的示例中,这将打印{'a': '1°c', 'b': '2°c'}。你知道吗

但在某些情况下(例如,您的错误大于rel_tol的默认值1e-9),则需要指定:math.isclose(i, j, rel_tol=your_epsilon)。你知道吗

相关问题 更多 >