获取NumPy中差异最小的数组元素的位置

时间:2012-10-21 17:50:53

标签: numpy

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

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

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

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

有没有人如何在NumPy中实现这个功能?我尝试过使用argwhere()但没有成功。

2 个答案:

答案 0 :(得分:2)

您可能需要考虑使用不同的算法来查找最近的一对。当您真正只需要将每个值与下一个最大值进行比较时,您当前的算法会比较每对值。您可以通过执行以下操作来执行此操作: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你可以做到这一点(但你可能不应该这样做):

where_a_is_6 = np.where(a == 6)[0]

答案 1 :(得分:0)

这是一个有点密集的单线程,不使用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)

以下是它的工作方式......

combinations用于创建所有对:

>>> 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)