网格搜索:获取最符合值的索引(对于整个矩阵)

时间:2014-05-13 08:08:04

标签: python numpy scipy

我知道这个问题派对已经得到了解答,但我特别关注numpy和scipy。说我有一个网格

lGrid = linspace(0.1, 8, 50)

我希望找到最适合2的索引,我做

index = abs(lGrid-2).argmin()
lGrid[index]
2.034

但是,如果我在这里有一个完整的值矩阵而不是2怎么办?我猜迭代很慢。但abs(lGrid-[2,4])会因形状问题而失败。我需要一个可以轻松扩展到N-dim矩阵的解决方案。在这种环境下,最好的行动方案是什么?

2 个答案:

答案 0 :(得分:1)

你“猜测迭代很慢”,但我猜它不是。所以我只是迭代“整个矩阵值而不是2”。也许:

 for val in BigArray.flatten():
    index = abs(lGrid-val).argmin()
    yield lGrid[index]

如果lGrid失败很大,那么迭代Python for循环的开销可能与其中发生的vecotirsed操作相比并不大。

可能有一种方法可以使用广播和重塑在一个巨大的操作中完成整个操作,但是会很复杂,并且您可能会意外地分配这样一个巨大的阵列,使您的机器减速到爬行。

答案 1 :(得分:1)

您可以使用广播:

from numpy import arange,linspace,argmin
vals = arange(30).reshape(2,5,3) #your N-dimensional input, like array([2,4])
lGrid = linspace(0.1, 8, 50)
result = argmin(abs(lGrid-vals[...,newaxis]),axis=-1)

例如,输入vals = array([2,4]),您获得result = array([12, 24])lGrid[result]=array([ 2.03469388, 3.96938776])