在 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.30951895
和 58.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))
>>>
我有一个像这样的 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.30951895
和 58.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))
>>>