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]:
我正在尝试编写我自己的最近邻搜索代码,我在其中输入 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]: