1

我有两个numpy数组。大小为w,h,2的'A'和'n'为2的'B'。换句话说,A是二维向量的二维阵列,而B是二维向量的一维数组。 我想要的结果是大小为w,h,n的数组。最后一个维度是一个n维向量,其中每个分量都是来自A的对应向量(由前两个维度w和h表示)与第n个向量B之间的欧几里德距离。多维数组之间欧几里得距离的numpy操作

我知道我可以通过手动方式循环访问python中的w,h和n并计算每个元素的距离,但是我想知道是否有一种聪明的方法可以用numpy操作来提高性能。

我发现了一些类似的问题,但不幸的是所有这些使用输入数组具有相同的维度。

回答

1

方法#1

你可以重塑A2D,使用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。距离。

+0

哇。第一种方法其实很简单。没想到那个!关于方法2,我对numpy相当陌生,你能否详细说明片和索引操作? [...,没有,1]的东西真的很混乱。 –

+0

非常感谢!似乎我仍然有很多关于numpy的知识;) –

+0

@MarioDekena'A [...,0,None]'看起来更直观。没有几个意见编辑。 – Divakar

相关问题