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

bar*_*sec 3 python numpy 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]])
Run Code Online (Sandbox Code Playgroud)

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

我需要的是找到生成的数组的两个最接近的值并返回它们的索引,在本例中值为58.3095189558.52349955,它应该返回坐标[0, 2] and [2, 2]

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

Tim*_*rts 5

当有人指出一句俏皮话时我会感到尴尬,但这里有一种方法可以做到这一点。

我将数组展平,然后对其进行排序,然后找到每个元素之间的增量。找到最小增量。现在,从排序后的数组中,我知道两个最接近元素的值。 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]))
Run Code Online (Sandbox Code Playgroud)

输出:

C:\tmp>python x.py
[[0 2]]
[[2 2]]
Run Code Online (Sandbox Code Playgroud)