Python 计算numpy行叉积上的欧氏距离?

Python 计算numpy行叉积上的欧氏距离?,python,arrays,numpy,Python,Arrays,Numpy,我有两个numpy数组,带有n个坐标(每行两个项目) coords_a=np.random.random((20,2)) coords_b=np.random.random((20,2)) 现在,对于每一行的组合,我想计算一个函数,并将返回值保存为矩阵中的项。因此,生成的数组应该具有形状(20,20),并且可以“延迟”计算,如下所示。作为示例函数,使用欧几里德距离 def euclidean_dist(x1:float,y1:float,x2:float,y2:float)->float: “

我有两个numpy数组,带有
n
个坐标(每行两个项目)

coords_a=np.random.random((20,2))
coords_b=np.random.random((20,2))
现在,对于每一行的组合,我想计算一个函数,并将返回值保存为矩阵中的项。因此,生成的数组应该具有形状
(20,20)
,并且可以“延迟”计算,如下所示。作为示例函数,使用欧几里德距离

def euclidean_dist(x1:float,y1:float,x2:float,y2:float)->float:
“”“返回两点(x1,y1)和(x2,y2)之间的欧几里德距离。”
返回np.sqrt(np.square(x1-x2)+np.square(y1-y2))
矩阵=[]
对于协调中的a:
行=[]
对于coords_b中的b:
行追加(欧几里德分布(*a,*b))
矩阵追加(行)
矩阵=np.数组(矩阵)
可以想象,这个嵌套for循环非常耗时,只需2000个坐标对,耗时超过25秒。有没有一种推荐的方法来引导这种叉积


提前感谢。

对于您的具体示例,您可以执行以下操作:

from scipy.spatial.distance import cdist
cdist(coords_b,coords_a)

一般来说,矢量化取决于您的函数。

我想加上我的2美分,因为并非所有函数都已经在numpy或scipy中实现。一般来说,您可以使用来实现矢量化解决方案。 对于欧几里德距离的具体情况,请参见以下操作:

将numpy导入为np
#定义坐标数组
coords_a=np.random.random((20,2))
coords_b=np.random.random((20,2))
#扩大其规模
a=协调(a[:,无]
b=坐标b[无,无]
#使用广播计算成对差异
d=a-b
#应用欧氏距离公式
r=np.sqrt(np.sum(d**2,轴=-1))
就这种特定情况下的时间性能而言,
scipy.space.distance.cdist
要快得多,但并非所有功能都可用:

import numpy as np
from scipy.spatial.distance import cdist

a = np.random.random((10_000, 2))
b = np.random.random((10_000, 2))

euc_broadcast = lambda a,b: np.sqrt(np.sum(np.square(a[:, None]-b[None, :]), axis=-1))

%timeit euc_broadcast(a, b)
3.39 s ± 149 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit cdist(a, b)
603 ms ± 13.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

为什么你需要懒惰的计算?你能详细说明你的实际问题吗?你能做每列的计算吗?你们的数组有多大?“Lazy”指的是我下面的例子,因为它不是矢量化的。我的问题是,这种计算必须在几千个集合上进行,每个集合包含2000到5000个坐标。一个5000x5000(X4floats)的计算应该很容易用几乎任何系统进行矢量化计算。那么,您希望向量化的函数到底是什么?这取决于功能。例如,对于欧几里德距离,有内置函数。我认为矢量化实现取决于需要应用的函数。对于numpy中可用作ufunc的函数,我打赌在ufunc上取外积会快得多。但是,任何任意函数都不一定可以通过这种方式使用。