我有一个一维网格,它被定义为排序浮点值的列表。这些点不是等距的,但可以保证没有任何碰撞点对(距离==0)。
我需要找到最有效的方法将任何给定值捕捉到最近的网格点我能想到的最聪明的方法如下(np
是numpy
并且myGrid
是一个numpyarray
)
absDiff = np.abs(myGrid - myValue)
ix = np.argmax(absDiff)
snappedValue = myGrid[ix]
问题是这个方法太慢了,我需要一个更有效的方法。
最佳答案
import bisect
def snap(myGrid, myValue):
ix = bisect.bisect_right(myGrid, myValue)
if ix == 0:
return myGrid[0]
elif ix == len(myGrid):
return myGrid[-1]
else:
return min(myGrid[ix - 1], myGrid[ix], key=lambda gridValue: abs(gridValue - myValue))