在 numpy ndarray 中找到两个最接近的值

find two closest values in numpy ndarray

我有一个像这样的 numpy ndarray

np.array(
[[40.26164428, 63.50590524, 58.30951895],
 [50.99019514, 69.0651866 , 60.44005295],
 [20.24845673, 14.31782106, 58.52349955],
 [54.58937626, 53.03772242, 21.09502311],
 [56.75385449, 57.5847202 ,  1.41421356]])

(注意:我生成的数组总是不同的形状(这个数组的形状是 (5, 3) 但它可以是 (2, 2) (4, 1)... ), 所以这不是 3D 坐标数组,它就是这样生成的)

我需要的是找到生成数组的两个最接近的值和 return 它们的索引,在这种情况下,值是 58.3095189558.52349955,应该 return坐标[0, 2] and [2, 2]

我试过使用 cKDtree,但这不是坐标数组,所以在这种情况下不起作用,我应该怎么做?

当有人指出单行时我会感到尴尬,但这是一种方法。

我将数组展平,然后对其进行排序,然后找到每个元素之间的增量。找到最小增量。现在,从排序后的数组中,我知道了两个最接近的元素的值。 argwhere 然后给我坐标。

import numpy as np

data = np.array(
[[40.26164428, 63.50590524, 58.30951895],
 [50.99019514, 69.0651866 , 60.44005295],
 [20.24845673, 14.31782106, 58.52349955],
 [54.58937626, 53.03772242, 21.09502311],
 [56.75385449, 57.5847202 ,  1.41421356]])


order = np.sort(data.reshape(-1))
delta = np.diff(order)
am = np.argmin(delta)
print( np.argwhere(data == order[am]))
print( np.argwhere(data == order[am+1]))

输出:

C:\tmp>python x.py
[[0 2]]
[[2 2]]

如果我理解正确的话,它们在数组中的位置是无关紧要的,所以在那种情况下很简单,将数字放入列表中以记住它们的原始位置,然后对其进行排序并找到两者之间的最小差异两个连续的元素

>>> import itertools
>>> def pairwise(iterable):
        a,b = itertools.tee(iterable)
        next(b,None)
        return zip(a,b)

>>> data=[[40.26164428, 63.50590524, 58.30951895],
 [50.99019514, 69.0651866,  60.44005295],
 [20.24845673, 14.31782106, 58.52349955],
 [54.58937626, 53.03772242, 21.09502311],
 [56.75385449, 57.5847202,   1.41421356]]
>>> linear=[ (value,x,y) for x,row in enumerate(data) for y,value in enumerate(row)]
>>> linear.sort(key=lambda x:x[0])
>>> min(pairwise(linear),key=lambda pair: abs(pair[0][0]-pair[1][0]))
((58.30951895, 0, 2), (58.52349955, 2, 2))
>>>