Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个numpy数组中元素之间的最小绝对差_Python_Arrays_Numpy - Fatal编程技术网

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

Python 两个numpy数组中元素之间的最小绝对差,python,arrays,numpy,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,尽管它们的大小可能不同。不过,我也对如何在起始阵列具有不同形状

考虑两个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,尽管它们的大小可能不同。不过,我也对如何在起始阵列具有不同形状时继续操作的技巧感兴趣。这仅仅是一个将两者都展平然后像以前一样继续的问题吗?

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

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

#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]
4
5
您希望它们采用单一数组格式:

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]
或者另一种解决方案(我认为会更快):

输出:

[ 4  6 -1]
[5 5 0]
4
5
注意:获取绝对距离数组的另一种方法是:

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

您可能也想在示例中包括
[-1,0]
。我非常喜欢X[dist.argmin()//Y.size]解决方案-它超级高效且快速。@user109387如果您只需要第一次出现,我只添加了一个我认为更快的解决方案(如果您需要这对解决方案。否则,前一个解决方案的性能应该差不多)。如果性能对您很重要,请查看。非常感谢。