两个numpy数组中元素之间的最小绝对差

时间:2020-08-25 23:12:10

标签: python arrays numpy

考虑两个1d numpy数组。

import numpy as np

X = np.array([-43, 21, 4, 6, -1, 22, 8])
Y = np.array([13, 5, -12, 0])

我想从X中找到具有最小绝对差值的值与Y中的值。在所示示例中,最小绝对差为1,由[[4, 5], [6, 5], [-1, 0]]给出。这个站点上有很多资源可以找到数组的最小元素,但是那不是我想要的。

对于当前问题,两个起始数组均为1d,尽管它们的大小可能不同。不过,如果起始数组的形状不同,我也会对如何进行操作的提示感兴趣。仅仅是平展然后像以前一样进行处理吗?

1 个答案:

答案 0 :(得分:1)

您可以计算绝对距离数组,然后在该数组中找到最小值。此方法适用于不同的XY长度。如果它们是多维的,只需先将它们展平(使用X.flatten(),...),然后将此解决方案应用于展平的数组:

如果要所有对具有最小绝对距离

#absolute distance between X and Y
dist = np.abs(X[:,None]-Y)
#elements of X with minimum absolute distance
X[np.where(dist==dist.min())[0]]    
#corresponding elements of Y with absolute distance
Y[np.where(dist==dist.min())[1]]

输出:

[ 4  6 -1]
[5 5 0]

并且您希望它们采用单一数组格式:

idx = np.where(dist==dist.min())
np.stack((X[idx[0]], Y[idx[1]])).T

[[ 4  5]
 [ 6  5]
 [-1  0]]

如果您想首次出现最小绝对距离,并提供更快的解决方案:

X[dist.argmin()//Y.size]
Y[dist.argmin()//X.size]

或同样是另一种解决方案(我认为会更快):

idx = np.unravel_index(np.argmin(dist), dist.shape)
X[idx[0]]
Y[idx[1]]

输出:

4
5

注意:获取绝对距离数组的另一种方法是:

dist = np.abs(np.subtract.outer(X,Y))