我有两组节点。节点集A包含节点ID和节点XYZ坐标的列表,例如:(ID:int,[x:浮点,y:浮点,z:浮点])。节点集B包含节点温度和节点XYZ坐标。集合A中的所有节点都应该(但不一定)在集合B中找到,但是集合B也可以包含其他节点。我需要根据它们的坐标将集合A中的节点与集合B中的相应节点进行匹配。主要问题是它们的坐标不完全匹配(存在浮动错误)。
该解决方案最好避免使用非标准库。我已经编码了我认为不是解决该问题的最佳解决方案的代码。我试图创建一个包含集合B的字典。键由一个包含截断坐标的元组组成,其中温度为值。然后,我使用截断的集合A坐标查询字典。 我想知道是否有更优雅,更准确的方法来解决该问题?
答案 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)
.