获取差异最小的数组元素的位置(以NumPy为单位)

获取差异最小的数组元素的位置(以NumPy为单位),numpy,Numpy,我试图实现一个逻辑,我试图从数组的其他元素中减去数组的每个元素,然后找到结果的最小差值 例:a=[10,7,3,6] 所以我从数组的每一个元素中减去10(结果是3,7,4) 然后移到下一个元素,即7,然后从数组的其余元素中减去它(结果将是4,1),取下一个元素,即3,并用剩余元素6减去它(结果:-3)。 注意:对于我的实际问题,我需要取结果的绝对值。 现在你可以看到,这个减法过程的结果的最小差值是1 到目前为止,我已经成功地编写了一个代码。但是,我还需要找到数字的索引,我得到的最小差值结果值为1

我试图实现一个逻辑,我试图从数组的其他元素中减去数组的每个元素,然后找到结果的最小差值

例:a=[10,7,3,6]

所以我从数组的每一个元素中减去10(结果是3,7,4) 然后移到下一个元素,即7,然后从数组的其余元素中减去它(结果将是4,1),取下一个元素,即3,并用剩余元素6减去它(结果:-3)。 注意:对于我的实际问题,我需要取结果的绝对值。 现在你可以看到,这个减法过程的结果的最小差值是1

到目前为止,我已经成功地编写了一个代码。但是,我还需要找到数字的索引,我得到的最小差值结果值为1(即本例中的索引7和6)


有人知道NumPy中是否有任何函数可以实现这一点吗?我尝试过使用argwhere(),但没有成功。

这里有一个不使用NumPy的密集单行程序:

>>> from itertools import combinations
>>> a = [10, 7, 3, 6]
>>> closest_pair = min((abs(x-y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2))[1]
>>> closest_pair
(1, 3)
下面是它的工作原理

组合
用于创建所有对:

>>> list(combinations(a, 2))
[(10, 7), (10, 3), (10, 6), (7, 3), (7, 6), (3, 6)]
我们需要元素的索引,因此修改为:

>>> list(combinations(enumerate(a), 2))
[((0, 10), (1, 7)),
 ((0, 10), (2, 3)),
 ((0, 10), (3, 6)),
 ((1, 7), (2, 3)),
 ((1, 7), (3, 6)),
 ((2, 3), (3, 6))]
列表理解作用于此结果,并形成一个新的绝对差异列表和相应的索引对:

>>> [(abs(x - y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2)]
[(3, (0, 1)), (7, (0, 2)), (4, (0, 3)), (4, (1, 2)), (1, (1, 3)), (3, (2, 3))]
取最小值即为元组,其第一个值为最小绝对距离,第二个值为索引的元组:

>>> min((abs(x - y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2))
(1, (1, 3))
最后,仅从该结果中提取索引:

>>> min((abs(x - y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2))[1]
(1, 3)

你可能想考虑一个不同的算法来找到最近的一对。当前算法比较每对值,而实际上只需要将每一个值与下一个最大值进行比较。你可以这样做:1)对数组排序

a
2)比较
a
中的邻居,找出最小的差异。这可能会帮助你开始

import numpy as np
a = np.array([10, 7, 3, 6])

index = np.argsort(a)
a_sorted = a[index]
diff = a_sorted[1:] - a_sorted[:-1]
此外,要找到a==6的位置,您可以这样做(但您可能不需要这样做):


如果这是家庭作业,请加上家庭作业标签。我更喜欢这个而不是我的答案。这是O(n*log(n))而不是O(n^2)。只需要几行就可以完成答案:
diff=np.abs(np.diff(a_排序));k=np.argmin(差异);最近的一对=索引[k:k+2]
我漏掉了最后几行,因为我怀疑这是家庭作业,尽管承认我可能已经放弃了太多。
where_a_is_6 = np.where(a == 6)[0]