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.30951895和58.52349955,它应该返回坐标[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]))
Run Code Online (Sandbox Code Playgroud)
输出:
C:\tmp>python x.py
[[0 2]]
[[2 2]]
Run Code Online (Sandbox Code Playgroud)