x&y距离的两个一维np数组,如何制作没有循环的结果的二维数组?

Two 1D np arrays of x&y distance, how to make 2D array of resultant without loop?

我正在尝试编写我自己的最近邻搜索代码,我在其中输入 x、y 坐标以及 X 和 Y 值的网格(每个都在一维 numpy 数组中)。

我所做的是为网格上的每个点计算 delta_x,为网格上的每个点计算 delta_y,然后用每个 XY 网格点的结果填充一个空的二维数组.那么最近邻应该是具有最小值的数组单元格..

我的问题是,目前我正在遍历这个空数组并以 1 对 1 的形式填充结果...必须有更好的方法,但我没有马上想到,我已经尝试过了进行了一些搜索,但也许我的措辞不正确。

任何人都可以建议一种不同的方法来加快速度吗?这是我当前的代码:

def NN(row, x, y):
    delx = x - row['Lon'] #X distance
    dely = y - row['Lat'] #Y distance
    r = np.zeros(shape=(len(y),len(x))) #empty 2D array of resultants
    for i in range(r.shape[0]):
        for j in range(r.shape[1]):
            r[i,j] = np.sqrt(dely[i]**2 + delx[j]**2) #fill each grid point with the resultant
    id = np.where(np.equal(r, np.min(r))) #find the mind row,col indices

我想消除嵌套的 for 循环,因为它超级慢...

如有任何帮助,我们将不胜感激。

向其中一项添加额外的 axis/dimension 将允许 broadcasting 并且不需要 for 循环:

In [8]: x
Out[8]: array([1, 2, 3, 4, 5, 6])

In [9]: y
Out[9]: array([2, 2, 2, 2, 2])

In [21]: x*x + y[:,None]*y[:,None]
Out[21]: 
array([[ 5,  8, 13, 20, 29, 40],
       [ 5,  8, 13, 20, 29, 40],
       [ 5,  8, 13, 20, 29, 40],
       [ 5,  8, 13, 20, 29, 40],
       [ 5,  8, 13, 20, 29, 40]])

In [22]: print(np.sqrt(x*x + y[:,None]*y[:,None]))
[[ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]
 [ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]
 [ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]
 [ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]
 [ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]]

只添加一次维度可能更容易:

In [30]: x2,y2 = x*x, y*y

In [31]: print(np.sqrt(x2 + y2[:,None]))
[[ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]
 [ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]
 [ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]
 [ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]
 [ 2.23606798  2.82842712  3.60555128  4.47213595  5.38516481  6.32455532]]

In [32]: