方法#1
你可以重塑A
到2D
,使用Scipy's cdist
一个期望二维数组作为输入,让那些欧几里得距离,最终重塑回3D
。
因此,实现将是 -
from scipy.spatial.distance import cdist
out = cdist(A.reshape(-1,2),B).reshape(w,h,-1)
方法2
由于,还原的轴线是唯一长度2
的,我们可以只切片输入阵列上节省存储器中间阵列,像这样 -
np.sqrt((A[...,0,None] - B[:,0])**2 + (A[...,1,None] - B[:,1])**2)
上的说明和A[...,1,None]
:
随着那个None
我们刚刚在切片A
末尾引入一个新的轴。好吧,让我们举一个小例子 -
In [54]: A = np.random.randint(0,9,(4,5,2))
In [55]: A[...,0].shape
Out[55]: (4, 5)
In [56]: A[...,0,None].shape
Out[56]: (4, 5, 1)
In [57]: B = np.random.randint(0,9,(3,2))
In [58]: B[:,0].shape
Out[58]: (3,)
因此,我们有:
A[...,0,None] : 4 x 5 x 1
B[:,0] : 3
这本质上是:
A[...,0,None] : 4 x 5 x 1
B[:,0] : 1 x 1 x 3
在进行减法,单身DIMS是对应broadcasted
到其他参与阵列的尺寸 -
A[...,0,None] - B : 4 x 5 x 3
我们沿着最后一个轴重复第二个索引。我们在平方后加上这两个数组,最后得到一个平方根来得到最终的eucl。距离。
哇。第一种方法其实很简单。没想到那个!关于方法2,我对numpy相当陌生,你能否详细说明片和索引操作? [...,没有,1]的东西真的很混乱。 –
非常感谢!似乎我仍然有很多关于numpy的知识;) –
@MarioDekena'A [...,0,None]'看起来更直观。没有几个意见编辑。 – Divakar