1

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

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

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

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

如果有任何函数可以在 NumPy 中实现这一点,有人会怎么做?我尝试使用 argwhere() 没有成功。

4

2 回答 2

2

You might want to consider a different algorithm for finding the closest pair. Your current algorithm compares every pair of values, when you really only need to compare each value to the next biggest value. You can do that by doing something like: 1) sort your array a 2) Compare neighbors in a to find the smallest difference. This might help you get started.

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]

Also to find where a == 6 you can do this (but you probably shouldn't need this):

where_a_is_6 = np.where(a == 6)[0]
于 2012-10-21T22:26:52.467 回答
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)
于 2012-10-21T19:32:48.240 回答