python - scipy 和 numpy 中的快速距离计算

标签 python performance numpy multidimensional-array scipy

A,B((day,observation,dim)) 数组。对于给定的一天,每个数组都包含相同数量的观察值,一个观察值是一个具有暗维度的点(即暗 float )。对于每一天,我都想计算当天 AB 中所有观测值之间的空间距离。

例如:

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

A, B = np.random.rand(50,1000,10), np.random.rand(50,1000,10)

output = []
for day in range(50):
    output.append(cdist(A[day],B[day]))

我在哪里使用 scipy.spatial.distance.cdist .

有没有更快的方法来做到这一点?理想情况下,我想为 output 获取一个 ((day,observation,observation)) 数组,其中每天包含 A< 中观察值之间的成对距离B 那天,同时以某种方式避免了几天的循环。

最佳答案

一种方法(尽管它需要大量内存)是巧妙地使用数组广播:

output = np.sqrt( np.sum( (A[:,:,np.newaxis,:] - B[:,np.newaxis,:,:])**2, axis=-1) )

编辑

但经过一些测试,似乎 scikit-learn 的 euclidean_distances是大型阵列的最佳选择。 (请注意,我已将您的循环重写为列表理解。)

这是每天 100 个数据点:

# your own code using cdist
from scipy.spatial.distance import cdist
%timeit dists1 = np.asarray([cdist(x,y) for x, y in zip(A, B)])

100 loops, best of 3: 8.81 ms per loop

# pure numpy with broadcasting
%timeit dists2 = np.sqrt( np.sum( (A[:,:,np.newaxis,:] - B[:,np.newaxis,:,:])**2, axis=-1) )

10 loops, best of 3: 46.9 ms per loop

# scikit-learn's algorithm
from sklearn.metrics.pairwise import euclidean_distances
%timeit dists3 = np.asarray([euclidean_distances(x,y) for x, y in zip(A, B)])
100 loops, best of 3: 12.6 ms per loop

这是每天 2000 个数据点:

In [5]: %timeit dists1 = np.asarray([cdist(x,y) for x, y in zip(A, B)])
1 loops, best of 3: 3.07 s per loop

In [7]: %timeit dists3 = np.asarray([euclidean_distances(x,y) for x, y in zip(A, B)])

1 loops, best of 3: 2.94 s per loop

关于python - scipy 和 numpy 中的快速距离计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31858530/

相关文章:

python - 计算一半对称 numpy 矩阵的更好方法?

python - 如何在 Odoo 12 中向多个用户(电子邮件地址)发送电子邮件模板

python - 从标签列表中快速获取项目 x (在数据中)的标签的方法

python - 在 Pandas 中导入 excel 文件出现错误

python - 将嵌套的 python 字典转换为多索引 pandas 数据框

java - 写入 XSSF Workbook 时,是什么导致我的程序陷入困境?

performance - 仅当游戏对象靠近 Controller /摄像机时才渲染它们

r - 聚合行及时关闭

Python:打乱包含重复项的字符串数组,同时保持项目的分布

python - 使用 numpy/scipy 计算连续向量之间距离的最快方法