gpt4 book ai didi

python - 如何在两个数组中找到最近的元素?

转载 作者:太空狗 更新时间:2023-10-29 22:21:27 27 4
gpt4 key购买 nike

我有两个 numpy 数组,例如 X=[x1,x2,x3,x4], y=[y1,y2,y3,y4]。其中三个元素很接近,而第四个元素可能接近也可能不接近。

喜欢:

X   [ 84.04467948  52.42447842  39.13555678  21.99846595]
y [ 78.86529444 52.42447842 38.74910101 21.99846595]

也可以是:

X   [ 84.04467948  60  52.42447842  39.13555678]
y [ 78.86529444 52.42447842 38.74910101 21.99846595]

我想定义一个函数来在两个数组中找到相应的索引,就像第一种情况:

  • y[0]对应X[0],
  • y[1]对应X[1],
  • y[2]对应X[2],
  • y[3]对应X[3]

第二种情况:

  • y[0]对应X[0],
  • y[1]对应X[2],
  • y[2] 对应X[3]
  • y[3]对应X[1]

我写不出一个函数来彻底解决问题,请大家帮忙。

最佳答案

您可以从预先计算距离矩阵开始,如 answer 中所示:

import numpy as np

X = np.array([84.04467948,60.,52.42447842,39.13555678])
Y = np.array([78.86529444,52.42447842,38.74910101,21.99846595])

dist = np.abs(X[:, np.newaxis] - Y)

现在您可以计算沿一个轴的最小值(我选择 1 对应于为每个 X 找到 Y 的最接近元素):

potentialClosest = dist.argmin(axis=1)

这仍然可能包含重复项(在您的情况下为 2)。要检查这一点,您可以使用 np.unique 找到 potentialClosest 中出现的所有 Y 索引。 :

closestFound, closestCounts = np.unique(potentialClosest, return_counts=True)

现在您可以通过检查 closestFound.shape[0] == X.shape[0] 来检查重复项。如果是这样,你就是黄金,potentialClosest 将包含你在 X 中每个元素的合作伙伴。但是在您的情况 2 中,一个元素将出现两次,因此 closestFound 将只有 X.shape[0]-1 元素,而 closestCounts 将不仅包含 1,还包含一个 2。对于计数为 1 的所有元素,已经找到合作伙伴。对于计数为 2 的两个候选者,尽管您必须选择更近的一个,而距离较大的那个的伙伴将是 Y 的一个元素,即不在 closestFound 中。这可以找到:

missingPartnerIndex = np.where(
np.in1d(np.arange(Y.shape[0]), closestFound)==False
)[0][0]

您可以在循环中进行匹配(尽管使用 numpy 可能有更好的方法)。这个解决方案相当丑陋但有效。非常感谢任何改进建议:

partners = np.empty_like(X, dtype=int)
nonClosePartnerFound = False
for i in np.arange(X.shape[0]):
if closestCounts[closestFound==potentialClosest[i]][0]==1:
# A unique partner was found
partners[i] = potentialClosest[i]
else:
# Partner is not unique
if nonClosePartnerFound:
partners[i] = potentialClosest[i]
else:
if np.argmin(dist[:, potentialClosest[i]]) == i:
partners[i] = potentialClosest[i]
else:
partners[i] = missingPartnerIndex
nonClosePartnerFound = True
print(partners)

这个答案只有在只有一对不接近的情况下才有效。如果不是这种情况,您将必须定义如何为多个非关闭元素找到正确的伙伴。遗憾的是,它既不是一个非常通用的解决方案,也不是一个非常好的解决方案,但希望您会发现它是一个有用的起点。

关于python - 如何在两个数组中找到最近的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39078043/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com