我想找到两个在meshgrid中找到一对值及其索引号,即一个壁橱到另一对值。假设我有两个向量a= np.array([0.01,0.5,0.9])
和b = np.array([0,3,6,10])
以及两个网格结构X,Y = np.meshgrid(a,b)
。为了说明,它们看起来如下:
X= array([[ 0.1, 0.5, 0.9],
[ 0.1, 0.5, 0.9],
[ 0.1, 0.5, 0.9],
[ 0.1, 0.5, 0.9]])
Y =array([[ 0, 0, 0],
[ 3, 3, 3],
[ 6, 6, 6],
[10, 10, 10]])
现在,我有另一个名为c
维度(2 x N)的数组。例如,假设c
包含以下条目:
c = array([[ 0.07268017, 0.08816632, 0.11084398, 0.13352165, 0.1490078 ],
[ 0.00091219, 0.00091219, 0.00091219, 0.00091219, 0.00091219]])
由c
表示x
的列向量。对于我想要找到的每个向量x
为了使事情复杂化,我实际上不仅寻找具有最小距离(i,j)的索引,而且还寻找第二小的距离(i',j')。
到目前为止,我所有的方法都非常复杂,涉及很多方面的路线。有人知道如何有效地解决问题吗?
答案 0 :(得分:2)
如果X, Y
始终来自meshgrid()
,则您的最小化在X
和Y
中是可分的。只需找到X
到c[0,]
的最接近元素以及Y
到c[1,]
的最接近元素---
您不需要计算二维指标。
如果a
或b
具有统一的步骤,那么如果将c
的相应值缩放到索引上,则可以节省更多时间。在您的示例all(a == 0.1+0.4*arange(3))
中,您可以通过反转x
找到x = (c[0,] - 0.1)/0.4
值。如果你有一个将整数映射到b
的可逆(可能是非线性)函数,你可以通过将反函数应用于y
来直接找到c[1,]
值。
答案 1 :(得分:1)
这是一个评论而不是一个答案,但我喜欢[...许多东西被仁慈地删除,你仍然可以看到使用修订历史...]
完成修订
作为我自己评论的后续内容,请查看以下内容
设置的
In [25]: from numpy import *
In [26]: from scipy.spatial import KDTree
In [27]: X= array([[ 0.1, 0.5, 0.9],
[ 0.1, 0.5, 0.9],
[ 0.1, 0.5, 0.9],
[ 0.1, 0.5, 0.9]])
In [28]: Y =array([[ 0, 0, 0],
[ 3, 3, 3],
[ 6, 6, 6],
[10, 10, 10]])
In [29]: c = array([[ 0.07268017, 0.08816632, 0.11084398, 0.13352165, 0.1490078 ],
[ 0.00091219, 0.00091219, 0.00091219, 0.00091219, 0.00091219]])
解决方案
两行代码,请注意您必须通过c
数组的转置。
In [30]: tree = KDTree(zip(X.ravel(), Y.ravel()))
In [31]: tree.query(c.T,k=2)
Out[31]:
(array([[ 0.02733505, 0.4273208 ],
[ 0.01186879, 0.41183469],
[ 0.01088228, 0.38915709],
[ 0.03353406, 0.36647949],
[ 0.04901629, 0.35099339]]), array([[0, 1],
[0, 1],
[0, 1],
[0, 1],
[0, 1]]))
评论
要解释结果,excellent scipy docs会通知您tree.query()
会为您提供两个数组,分别包含c
k>=2
的数组,为您提供距离
从点到网格上的最近点,第二个最接近的点等,k>=2
的数组,为您提供索引
指向最接近的网格点(下一个关闭等)。要访问网格点,KDTree
会保留网格数据的副本,例如
In [32]: tree.data[[0,1]]
Out[32]:
array([[ 0.1, 0. ],
[ 0.5, 0. ]])
其中[0,1]
是第二个输出数组的第一个元素。
如果您需要网格矩阵中最近(s)点的索引,只需使用divmod
即可。